From adec816ec45edf6b8243d18f50376e98ddf7dad6 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 10 Jul 2026 11:10:34 -0700 Subject: [PATCH 01/93] fuzzz --- scripts/fuzz_opt.py | 19 ++++++++++++++++++- src/passes/ConstraintAnalysis.cpp | 1 + 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/scripts/fuzz_opt.py b/scripts/fuzz_opt.py index 55dce6dc47c..5ab34869355 100755 --- a/scripts/fuzz_opt.py +++ b/scripts/fuzz_opt.py @@ -2565,7 +2565,8 @@ def handle(self, wasm): # The global list of all test case handlers testcase_handlers = [ FuzzExec(), - CompareVMs(), +] +''' CompareVMs(), CheckDeterminism(), Wasm2JS(), TrapsNeverHappen(), @@ -2579,6 +2580,7 @@ def handle(self, wasm): PreserveImportsExportsJS(), BranchHintPreservation(), ] +''' # Do one test, given an input file for -ttf and some optimizations to run @@ -2687,6 +2689,21 @@ def write_commands(commands, filename): ("--code-pushing",), ("--code-folding",), ("--const-hoisting",), + ("--constraint-analysis",), + ("--constraint-analysis",), + ("--constraint-analysis",), + ("--constraint-analysis",), + ("--constraint-analysis",), + ("--constraint-analysis",), + ("--constraint-analysis",), + ("--constraint-analysis",), + ("--constraint-analysis",), + ("--constraint-analysis",), + ("--constraint-analysis",), + ("--constraint-analysis",), + ("--constraint-analysis",), + ("--constraint-analysis",), + ("--constraint-analysis",), ("--dae",), ("--dae-optimizing",), ("--dae2",), diff --git a/src/passes/ConstraintAnalysis.cpp b/src/passes/ConstraintAnalysis.cpp index 25173ee8d9f..e3c348be463 100644 --- a/src/passes/ConstraintAnalysis.cpp +++ b/src/passes/ConstraintAnalysis.cpp @@ -318,6 +318,7 @@ struct ConstraintAnalysis constraints.setProvesNothing(set->index); } } + std::cout << "applied " << *curr << " => " << constraints << '\n'; } }; From 14e19d98c57058faf9e3381270177c1bb5bf73bf Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 10 Jul 2026 11:11:45 -0700 Subject: [PATCH 02/93] fuzzz --- src/passes/ConstraintAnalysis.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/passes/ConstraintAnalysis.cpp b/src/passes/ConstraintAnalysis.cpp index e3c348be463..af2294496ee 100644 --- a/src/passes/ConstraintAnalysis.cpp +++ b/src/passes/ConstraintAnalysis.cpp @@ -318,7 +318,7 @@ struct ConstraintAnalysis constraints.setProvesNothing(set->index); } } - std::cout << "applied " << *curr << " => " << constraints << '\n'; + //std::cout << "applied " << *curr << " => " << constraints << '\n'; } }; From 7ea0ffd7b0190a2cb33ddb1c75cb4837e76224a3 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 10 Jul 2026 14:18:11 -0700 Subject: [PATCH 03/93] undo --- src/passes/ConstraintAnalysis.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/passes/ConstraintAnalysis.cpp b/src/passes/ConstraintAnalysis.cpp index 51b5982df74..caf665ede1a 100644 --- a/src/passes/ConstraintAnalysis.cpp +++ b/src/passes/ConstraintAnalysis.cpp @@ -320,7 +320,6 @@ struct ConstraintAnalysis constraints.setProvesNothing(set->index); } } - //std::cout << "applied " << *curr << " => " << constraints << '\n'; } }; From e0276dbe43cfaedfa9cf39bf8cfe49d6f187637f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 14 Jul 2026 16:15:28 -0700 Subject: [PATCH 04/93] update --- scripts/fuzz_opt.py | 4 +- src/passes/pass.cpp | 4 +- test/passes/fannkuch3_manyopts_dwarf.bin.txt | 4127 +++++++++--------- 3 files changed, 2054 insertions(+), 2081 deletions(-) diff --git a/scripts/fuzz_opt.py b/scripts/fuzz_opt.py index 5ab34869355..891ecd37b49 100755 --- a/scripts/fuzz_opt.py +++ b/scripts/fuzz_opt.py @@ -2565,8 +2565,7 @@ def handle(self, wasm): # The global list of all test case handlers testcase_handlers = [ FuzzExec(), -] -''' CompareVMs(), + CompareVMs(), CheckDeterminism(), Wasm2JS(), TrapsNeverHappen(), @@ -2580,7 +2579,6 @@ def handle(self, wasm): PreserveImportsExportsJS(), BranchHintPreservation(), ] -''' # Do one test, given an input file for -ttf and some optimizations to run diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp index 06339ca5a6b..64a673db464 100644 --- a/src/passes/pass.cpp +++ b/src/passes/pass.cpp @@ -738,8 +738,10 @@ void PassRunner::addDefaultFunctionOptimizationPasses() { addIfNoDWARFIssues( "remove-unused-names"); // remove-unused-brs opens opportunities addIfNoDWARFIssues("merge-blocks"); // clean up remove-unused-brs new blocks - // late propagation + // late propagation (and, optionally, constraint analysis which can generate + // more constants to propagate) if (options.optimizeLevel >= 3 || options.shrinkLevel >= 2) { + addIfNoDWARFIssues("constraint-analysis"); addIfNoDWARFIssues("precompute-propagate"); } else { addIfNoDWARFIssues("precompute"); diff --git a/test/passes/fannkuch3_manyopts_dwarf.bin.txt b/test/passes/fannkuch3_manyopts_dwarf.bin.txt index 61a83f3aa28..a7140d004a4 100644 --- a/test/passes/fannkuch3_manyopts_dwarf.bin.txt +++ b/test/passes/fannkuch3_manyopts_dwarf.bin.txt @@ -2303,7 +2303,7 @@ Contains section .debug_info (851 bytes) Contains section .debug_loc (1073 bytes) Contains section .debug_ranges (88 bytes) Contains section .debug_abbrev (333 bytes) -Contains section .debug_line (2642 bytes) +Contains section .debug_line (2618 bytes) Contains section .debug_str (434 bytes) .debug_abbrev contents: @@ -2469,8 +2469,8 @@ Abbrev table for offset: 0x00000000 DW_AT_comp_dir [DW_FORM_strp] ( .debug_str[0x000000a9] = "/usr/local/google/home/azakai/Dev/2-binaryen") DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) DW_AT_ranges [DW_FORM_sec_offset] (0x00000040 - [0x00000006, 0x00000381) - [0x00000383, 0x00000662)) + [0x00000006, 0x00000377) + [0x00000379, 0x00000658)) 0x00000026: DW_TAG_pointer_type [2] DW_AT_type [DW_FORM_ref4] (cu + 0x002b => {0x0000002b} "worker_args") @@ -2534,7 +2534,7 @@ Abbrev table for offset: 0x00000000 0x00000082: DW_TAG_subprogram [10] * DW_AT_low_pc [DW_FORM_addr] (0x0000000000000006) - DW_AT_high_pc [DW_FORM_data4] (0x0000037b) + DW_AT_high_pc [DW_FORM_data4] (0x00000371) DW_AT_frame_base [DW_FORM_exprloc] (DW_OP_WASM_location 0x1 +0, DW_OP_stack_value) DW_AT_GNU_all_call_sites [DW_FORM_flag_present] (true) DW_AT_linkage_name [DW_FORM_strp] ( .debug_str[0x00000166] = "_Z15fannkuch_workerPv") @@ -2569,13 +2569,13 @@ Abbrev table for offset: 0x00000000 DW_AT_location [DW_FORM_sec_offset] (0x0000001d: [0xffffffff, 0x00000027): [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value - [0x0000003d, 0x00000042): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value + [0x0000003b, 0x00000040): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +1, DW_OP_stack_value - [0x0000010c, 0x00000116): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value + [0x00000103, 0x0000010d): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value - [0x00000235, 0x00000240): DW_OP_consts +0, DW_OP_stack_value + [0x0000022b, 0x00000236): DW_OP_consts +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +1, DW_OP_stack_value - [0x00000289, 0x00000293): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value + [0x0000027f, 0x00000289): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value) DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000d6] = "i") DW_AT_decl_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") @@ -2620,9 +2620,9 @@ Abbrev table for offset: 0x00000000 0x0000010e: DW_TAG_variable [13] DW_AT_location [DW_FORM_sec_offset] (0x0000011d: - [0xffffffff, 0x000001e2): + [0xffffffff, 0x000001d9): [0x00000000, 0x00000005): DW_OP_WASM_location 0x0 +2, DW_OP_stack_value - [0x0000017d, 0x00000182): DW_OP_WASM_location 0x0 +2, DW_OP_stack_value) + [0x0000017c, 0x00000181): DW_OP_WASM_location 0x0 +2, DW_OP_stack_value) DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000014a] = "r") DW_AT_decl_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") DW_AT_decl_line [DW_FORM_data1] (30) @@ -2630,13 +2630,13 @@ Abbrev table for offset: 0x00000000 0x0000011d: DW_TAG_variable [13] DW_AT_location [DW_FORM_sec_offset] (0x00000149: - [0xffffffff, 0x000000d7): + [0xffffffff, 0x000000ce): [0x00000000, 0x00000013): DW_OP_consts +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +13, DW_OP_stack_value [0x00000085, 0x0000008d): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value - [0x00000185, 0x00000190): DW_OP_consts +0, DW_OP_stack_value + [0x00000184, 0x0000018f): DW_OP_consts +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +10, DW_OP_stack_value - [0x00000202, 0x0000020a): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value) + [0x00000201, 0x00000209): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value) DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000155] = "flips") DW_AT_decl_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") DW_AT_decl_line [DW_FORM_data1] (30) @@ -2644,9 +2644,9 @@ Abbrev table for offset: 0x00000000 0x0000012c: DW_TAG_variable [13] DW_AT_location [DW_FORM_sec_offset] (0x000001ab: - [0xffffffff, 0x000000e6): + [0xffffffff, 0x000000dd): [0x00000000, 0x00000004): DW_OP_WASM_location 0x0 +12, DW_OP_stack_value - [0x0000017d, 0x00000181): DW_OP_WASM_location 0x0 +16, DW_OP_stack_value) + [0x0000017c, 0x00000180): DW_OP_WASM_location 0x0 +16, DW_OP_stack_value) DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000019b] = "k") DW_AT_decl_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") DW_AT_decl_line [DW_FORM_data1] (30) @@ -2654,11 +2654,11 @@ Abbrev table for offset: 0x00000000 0x0000013b: DW_TAG_variable [13] DW_AT_location [DW_FORM_sec_offset] (0x000001d7: - [0xffffffff, 0x000000fe): + [0xffffffff, 0x000000f5): [0x00000000, 0x00000004): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value [0x0000003c, 0x0000003f): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value - [0x0000017d, 0x00000181): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value - [0x000001b9, 0x000001bc): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value) + [0x0000017c, 0x00000180): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value + [0x000001b8, 0x000001bb): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value) DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000019d] = "j") DW_AT_decl_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") DW_AT_decl_line [DW_FORM_data1] (30) @@ -2666,11 +2666,11 @@ Abbrev table for offset: 0x00000000 0x0000014a: DW_TAG_variable [13] DW_AT_location [DW_FORM_sec_offset] (0x0000021f: - [0xffffffff, 0x00000113): + [0xffffffff, 0x0000010a): [0x00000000, 0x0000002a): DW_OP_WASM_location 0x0 +15, DW_OP_stack_value [0x0000003b, 0x00000051): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value - [0x0000017d, 0x000001a7): DW_OP_WASM_location 0x0 +14, DW_OP_stack_value - [0x000001b8, 0x000001ce): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value) + [0x0000017c, 0x000001a6): DW_OP_WASM_location 0x0 +14, DW_OP_stack_value + [0x000001b7, 0x000001cd): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value) DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000019f] = "tmp") DW_AT_decl_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") DW_AT_decl_line [DW_FORM_data1] (30) @@ -2678,10 +2678,10 @@ Abbrev table for offset: 0x00000000 0x00000159: DW_TAG_lexical_block [14] * DW_AT_ranges [DW_FORM_sec_offset] (0x00000000 - [0x0000017f, 0x000001bd) - [0x000001e7, 0x000001f0) - [0x000002fc, 0x0000033a) - [0x00000364, 0x0000036d)) + [0x00000176, 0x000001b4) + [0x000001de, 0x000001e7) + [0x000002f2, 0x00000330) + [0x0000035a, 0x00000363)) 0x0000015e: DW_TAG_variable [12] DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000163] = "p0") @@ -2701,19 +2701,19 @@ Abbrev table for offset: 0x00000000 DW_AT_low_pc [DW_FORM_addr] (0x0000000000000041) 0x00000179: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x00000000000000df) + DW_AT_low_pc [DW_FORM_addr] (0x00000000000000d6) 0x0000017e: DW_TAG_GNU_call_site [16] DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x019a => {0x0000019a} "free") - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000376) + DW_AT_low_pc [DW_FORM_addr] (0x000000000000036c) 0x00000187: DW_TAG_GNU_call_site [16] DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x019a => {0x0000019a} "free") - DW_AT_low_pc [DW_FORM_addr] (0x000000000000037a) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000370) 0x00000190: DW_TAG_GNU_call_site [16] DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x019a => {0x0000019a} "free") - DW_AT_low_pc [DW_FORM_addr] (0x000000000000037e) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000374) 0x00000199: NULL @@ -2817,7 +2817,7 @@ Abbrev table for offset: 0x00000000 0x0000023a: NULL 0x0000023b: DW_TAG_subprogram [23] * - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000383) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000379) DW_AT_high_pc [DW_FORM_data4] (0x000002df) DW_AT_frame_base [DW_FORM_exprloc] (DW_OP_WASM_location 0x0 +2, DW_OP_stack_value) DW_AT_GNU_all_call_sites [DW_FORM_flag_present] (true) @@ -2841,7 +2841,7 @@ Abbrev table for offset: 0x00000000 0x00000269: DW_TAG_variable [13] DW_AT_location [DW_FORM_sec_offset] (0x00000267: - [0xffffffff, 0x000003af): + [0xffffffff, 0x000003a5): [0x00000000, 0x00000005): DW_OP_WASM_location 0x0 +4, DW_OP_stack_value) DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000dc] = "n") DW_AT_decl_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") @@ -2850,8 +2850,8 @@ Abbrev table for offset: 0x00000000 0x00000278: DW_TAG_inlined_subroutine [24] * DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x01a8 => {0x000001a8} "_ZL8fannkuchi") - DW_AT_low_pc [DW_FORM_addr] (0x00000000000003c2) - DW_AT_high_pc [DW_FORM_data4] (0xfffffc3e) + DW_AT_low_pc [DW_FORM_addr] (0x00000000000003b8) + DW_AT_high_pc [DW_FORM_data4] (0xfffffc48) DW_AT_call_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") DW_AT_call_line [DW_FORM_data1] (159) DW_AT_call_column [DW_FORM_data1] (0x29) @@ -2867,14 +2867,14 @@ Abbrev table for offset: 0x00000000 0x00000296: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x000002a2: - [0xffffffff, 0x00000627): + [0xffffffff, 0x0000061d): [0x00000001, 0x00000001): DW_OP_lit0, DW_OP_stack_value [0x00000000, 0x00000018): DW_OP_WASM_location 0x0 +6, DW_OP_stack_value) DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x01ce => {0x000001ce} "args") 0x0000029f: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x000002cc: - [0xffffffff, 0x000003fe): + [0xffffffff, 0x000003f4): [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value [0x00000000, 0x00000005): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value @@ -2891,48 +2891,48 @@ Abbrev table for offset: 0x00000000 0x000002ad: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x00000354: - [0xffffffff, 0x00000414): + [0xffffffff, 0x0000040a): [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value) DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x01ef => {0x000001ef} "perm1") 0x000002b6: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x00000372: - [0xffffffff, 0x0000041a): + [0xffffffff, 0x00000410): [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +5, DW_OP_stack_value) DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x01fa => {0x000001fa} "count") 0x000002bf: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x00000390: - [0xffffffff, 0x00000537): + [0xffffffff, 0x0000052d): [0x00000000, 0x00000007): DW_OP_WASM_location 0x0 +6, DW_OP_stack_value [0x000000be, 0x000000c5): DW_OP_WASM_location 0x0 +6, DW_OP_stack_value) DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x0205 => {0x00000205} "r") 0x000002c8: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x000003e8: - [0xffffffff, 0x00000610): + [0xffffffff, 0x00000606): [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value [0x00000027, 0x0000002f): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value) DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x0210 => {0x00000210} "maxflips") 0x000002d1: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x00000413: - [0xffffffff, 0x00000620): + [0xffffffff, 0x00000616): [0x00000000, 0x0000001f): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value) DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x021b => {0x0000021b} "flips") 0x000002da: DW_TAG_label [28] DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x0226 => {0x00000226} "cleanup") - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000604) + DW_AT_low_pc [DW_FORM_addr] (0x00000000000005fa) 0x000002e3: DW_TAG_lexical_block [14] * DW_AT_ranges [DW_FORM_sec_offset] (0x00000028 - [0x000004cd, 0x00000512) - [0x00000585, 0x000005d0)) + [0x000004c3, 0x00000508) + [0x0000057b, 0x000005c6)) 0x000002e8: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x000003bc: - [0xffffffff, 0x0000058e): + [0xffffffff, 0x00000584): [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +8, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +8, DW_OP_stack_value) DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x022e => {0x0000022e} "p0") @@ -2942,46 +2942,46 @@ Abbrev table for offset: 0x00000000 0x000002f2: NULL 0x000002f3: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x00000000000003ad) + DW_AT_low_pc [DW_FORM_addr] (0x00000000000003a3) 0x000002f8: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x00000000000003ba) + DW_AT_low_pc [DW_FORM_addr] (0x00000000000003b0) 0x000002fd: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x00000000000003de) + DW_AT_low_pc [DW_FORM_addr] (0x00000000000003d4) 0x00000302: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000412) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000408) 0x00000307: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000418) + DW_AT_low_pc [DW_FORM_addr] (0x000000000000040e) 0x0000030c: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x000000000000047e) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000474) 0x00000311: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000490) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000486) 0x00000316: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x000000000000054e) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000544) 0x0000031b: DW_TAG_GNU_call_site [16] DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x019a => {0x0000019a} "free") - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000608) + DW_AT_low_pc [DW_FORM_addr] (0x00000000000005fe) 0x00000324: DW_TAG_GNU_call_site [16] DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x019a => {0x0000019a} "free") - DW_AT_low_pc [DW_FORM_addr] (0x000000000000060c) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000602) 0x0000032d: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x000000000000061e) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000614) 0x00000332: DW_TAG_GNU_call_site [16] DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x019a => {0x0000019a} "free") - DW_AT_low_pc [DW_FORM_addr] (0x000000000000062b) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000621) 0x0000033b: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000656) + DW_AT_low_pc [DW_FORM_addr] (0x000000000000064c) 0x00000340: NULL @@ -3006,13 +3006,13 @@ Abbrev table for offset: 0x00000000 0x0000001d: [0xffffffff, 0x00000027): [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value - [0x0000003d, 0x00000042): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value + [0x0000003b, 0x00000040): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +1, DW_OP_stack_value - [0x0000010c, 0x00000116): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value + [0x00000103, 0x0000010d): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value - [0x00000235, 0x00000240): DW_OP_consts +0, DW_OP_stack_value + [0x0000022b, 0x00000236): DW_OP_consts +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +1, DW_OP_stack_value - [0x00000289, 0x00000293): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value + [0x0000027f, 0x00000289): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value 0x000000a5: @@ -3032,40 +3032,40 @@ Abbrev table for offset: 0x00000000 [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +6, DW_OP_stack_value 0x0000011d: - [0xffffffff, 0x000001e2): + [0xffffffff, 0x000001d9): [0x00000000, 0x00000005): DW_OP_WASM_location 0x0 +2, DW_OP_stack_value - [0x0000017d, 0x00000182): DW_OP_WASM_location 0x0 +2, DW_OP_stack_value + [0x0000017c, 0x00000181): DW_OP_WASM_location 0x0 +2, DW_OP_stack_value 0x00000149: - [0xffffffff, 0x000000d7): + [0xffffffff, 0x000000ce): [0x00000000, 0x00000013): DW_OP_consts +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +13, DW_OP_stack_value [0x00000085, 0x0000008d): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value - [0x00000185, 0x00000190): DW_OP_consts +0, DW_OP_stack_value + [0x00000184, 0x0000018f): DW_OP_consts +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +10, DW_OP_stack_value - [0x00000202, 0x0000020a): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value + [0x00000201, 0x00000209): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value 0x000001ab: - [0xffffffff, 0x000000e6): + [0xffffffff, 0x000000dd): [0x00000000, 0x00000004): DW_OP_WASM_location 0x0 +12, DW_OP_stack_value - [0x0000017d, 0x00000181): DW_OP_WASM_location 0x0 +16, DW_OP_stack_value + [0x0000017c, 0x00000180): DW_OP_WASM_location 0x0 +16, DW_OP_stack_value 0x000001d7: - [0xffffffff, 0x000000fe): + [0xffffffff, 0x000000f5): [0x00000000, 0x00000004): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value [0x0000003c, 0x0000003f): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value - [0x0000017d, 0x00000181): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value - [0x000001b9, 0x000001bc): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value + [0x0000017c, 0x00000180): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value + [0x000001b8, 0x000001bb): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value 0x0000021f: - [0xffffffff, 0x00000113): + [0xffffffff, 0x0000010a): [0x00000000, 0x0000002a): DW_OP_WASM_location 0x0 +15, DW_OP_stack_value [0x0000003b, 0x00000051): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value - [0x0000017d, 0x000001a7): DW_OP_WASM_location 0x0 +14, DW_OP_stack_value - [0x000001b8, 0x000001ce): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value + [0x0000017c, 0x000001a6): DW_OP_WASM_location 0x0 +14, DW_OP_stack_value + [0x000001b7, 0x000001cd): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value 0x00000267: - [0xffffffff, 0x000003af): + [0xffffffff, 0x000003a5): [0x00000000, 0x00000005): DW_OP_WASM_location 0x0 +4, DW_OP_stack_value 0x00000285: @@ -3073,12 +3073,12 @@ Abbrev table for offset: 0x00000000 [0x00000001, 0x00000001): DW_OP_consts +30, DW_OP_stack_value 0x000002a2: - [0xffffffff, 0x00000627): + [0xffffffff, 0x0000061d): [0x00000001, 0x00000001): DW_OP_lit0, DW_OP_stack_value [0x00000000, 0x00000018): DW_OP_WASM_location 0x0 +6, DW_OP_stack_value 0x000002cc: - [0xffffffff, 0x000003fe): + [0xffffffff, 0x000003f4): [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value [0x00000000, 0x00000005): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value @@ -3090,36 +3090,36 @@ Abbrev table for offset: 0x00000000 [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value 0x00000354: - [0xffffffff, 0x00000414): + [0xffffffff, 0x0000040a): [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value 0x00000372: - [0xffffffff, 0x0000041a): + [0xffffffff, 0x00000410): [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +5, DW_OP_stack_value 0x00000390: - [0xffffffff, 0x00000537): + [0xffffffff, 0x0000052d): [0x00000000, 0x00000007): DW_OP_WASM_location 0x0 +6, DW_OP_stack_value [0x000000be, 0x000000c5): DW_OP_WASM_location 0x0 +6, DW_OP_stack_value 0x000003bc: - [0xffffffff, 0x0000058e): + [0xffffffff, 0x00000584): [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +8, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +8, DW_OP_stack_value 0x000003e8: - [0xffffffff, 0x00000610): + [0xffffffff, 0x00000606): [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value [0x00000027, 0x0000002f): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value 0x00000413: - [0xffffffff, 0x00000620): + [0xffffffff, 0x00000616): [0x00000000, 0x0000001f): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value .debug_line contents: debug_line[0x00000000] Line table prologue: - total_length: 0x00000a4e + total_length: 0x00000a36 version: 4 prologue_length: 0x000000dd min_inst_length: 1 @@ -3204,1422 +3204,1408 @@ file_names[ 4]: 0x000000000000003d 36 18 1 0 0 is_stmt -0x0000012e: 00 DW_LNE_set_address (0x0000000000000047) +0x0000012e: 00 DW_LNE_set_address (0x0000000000000045) 0x00000135: 03 DW_LNS_advance_line (37) 0x00000137: 01 DW_LNS_copy - 0x0000000000000047 37 18 1 0 0 is_stmt + 0x0000000000000045 37 18 1 0 0 is_stmt -0x00000138: 00 DW_LNE_set_address (0x0000000000000050) +0x00000138: 00 DW_LNE_set_address (0x000000000000004e) 0x0000013f: 03 DW_LNS_advance_line (38) 0x00000141: 05 DW_LNS_set_column (7) 0x00000143: 01 DW_LNS_copy - 0x0000000000000050 38 7 1 0 0 is_stmt + 0x000000000000004e 38 7 1 0 0 is_stmt -0x00000144: 00 DW_LNE_set_address (0x0000000000000058) +0x00000144: 00 DW_LNE_set_address (0x0000000000000056) 0x0000014b: 05 DW_LNS_set_column (16) 0x0000014d: 06 DW_LNS_negate_stmt 0x0000014e: 01 DW_LNS_copy - 0x0000000000000058 38 16 1 0 0 + 0x0000000000000056 38 16 1 0 0 -0x0000014f: 00 DW_LNE_set_address (0x000000000000005d) +0x0000014f: 00 DW_LNE_set_address (0x000000000000005b) 0x00000156: 03 DW_LNS_advance_line (37) 0x00000158: 05 DW_LNS_set_column (24) 0x0000015a: 06 DW_LNS_negate_stmt 0x0000015b: 01 DW_LNS_copy - 0x000000000000005d 37 24 1 0 0 is_stmt + 0x000000000000005b 37 24 1 0 0 is_stmt -0x0000015c: 00 DW_LNE_set_address (0x0000000000000062) +0x0000015c: 00 DW_LNE_set_address (0x0000000000000060) 0x00000163: 05 DW_LNS_set_column (18) 0x00000165: 06 DW_LNS_negate_stmt 0x00000166: 01 DW_LNS_copy - 0x0000000000000062 37 18 1 0 0 + 0x0000000000000060 37 18 1 0 0 -0x00000167: 00 DW_LNE_set_address (0x0000000000000067) +0x00000167: 00 DW_LNE_set_address (0x0000000000000065) 0x0000016e: 05 DW_LNS_set_column (4) 0x00000170: 01 DW_LNS_copy - 0x0000000000000067 37 4 1 0 0 + 0x0000000000000065 37 4 1 0 0 -0x00000171: 00 DW_LNE_set_address (0x000000000000006a) +0x00000171: 00 DW_LNE_set_address (0x0000000000000068) 0x00000178: 03 DW_LNS_advance_line (39) 0x0000017a: 06 DW_LNS_negate_stmt 0x0000017b: 01 DW_LNS_copy - 0x000000000000006a 39 4 1 0 0 is_stmt + 0x0000000000000068 39 4 1 0 0 is_stmt -0x0000017c: 00 DW_LNE_set_address (0x000000000000006c) +0x0000017c: 00 DW_LNE_set_address (0x000000000000006a) 0x00000183: 05 DW_LNS_set_column (16) 0x00000185: 06 DW_LNS_negate_stmt 0x00000186: 01 DW_LNS_copy - 0x000000000000006c 39 16 1 0 0 + 0x000000000000006a 39 16 1 0 0 -0x00000187: 00 DW_LNE_set_address (0x0000000000000075) +0x00000187: 00 DW_LNE_set_address (0x0000000000000073) 0x0000018e: 05 DW_LNS_set_column (4) 0x00000190: 01 DW_LNS_copy - 0x0000000000000075 39 4 1 0 0 + 0x0000000000000073 39 4 1 0 0 -0x00000191: 00 DW_LNE_set_address (0x0000000000000077) +0x00000191: 00 DW_LNE_set_address (0x0000000000000075) 0x00000198: 05 DW_LNS_set_column (23) 0x0000019a: 01 DW_LNS_copy - 0x0000000000000077 39 23 1 0 0 + 0x0000000000000075 39 23 1 0 0 -0x0000019b: 00 DW_LNE_set_address (0x000000000000007c) +0x0000019b: 00 DW_LNE_set_address (0x000000000000007a) 0x000001a2: 05 DW_LNS_set_column (19) 0x000001a4: 01 DW_LNS_copy - 0x000000000000007c 39 19 1 0 0 + 0x000000000000007a 39 19 1 0 0 -0x000001a5: 00 DW_LNE_set_address (0x0000000000000081) +0x000001a5: 00 DW_LNE_set_address (0x000000000000007f) 0x000001ac: 03 DW_LNS_advance_line (40) 0x000001ae: 05 DW_LNS_set_column (4) 0x000001b0: 06 DW_LNS_negate_stmt 0x000001b1: 01 DW_LNS_copy - 0x0000000000000081 40 4 1 0 0 is_stmt + 0x000000000000007f 40 4 1 0 0 is_stmt -0x000001b2: 00 DW_LNE_set_address (0x0000000000000089) +0x000001b2: 00 DW_LNE_set_address (0x0000000000000087) 0x000001b9: 05 DW_LNS_set_column (17) 0x000001bb: 06 DW_LNS_negate_stmt 0x000001bc: 01 DW_LNS_copy - 0x0000000000000089 40 17 1 0 0 + 0x0000000000000087 40 17 1 0 0 0x000001bd: 00 DW_LNE_set_address (0x0000000000000090) -0x000001c4: 03 DW_LNS_advance_line (37) -0x000001c6: 05 DW_LNS_set_column (18) +0x000001c4: 03 DW_LNS_advance_line (44) +0x000001c6: 05 DW_LNS_set_column (16) 0x000001c8: 06 DW_LNS_negate_stmt 0x000001c9: 01 DW_LNS_copy - 0x0000000000000090 37 18 1 0 0 is_stmt + 0x0000000000000090 44 16 1 0 0 is_stmt -0x000001ca: 00 DW_LNE_set_address (0x0000000000000095) -0x000001d1: 03 DW_LNS_advance_line (43) -0x000001d3: 05 DW_LNS_set_column (4) +0x000001ca: 00 DW_LNE_set_address (0x0000000000000099) +0x000001d1: 03 DW_LNS_advance_line (45) +0x000001d3: 05 DW_LNS_set_column (10) 0x000001d5: 01 DW_LNS_copy - 0x0000000000000095 43 4 1 0 0 is_stmt + 0x0000000000000099 45 10 1 0 0 is_stmt -0x000001d6: 00 DW_LNE_set_address (0x0000000000000099) -0x000001dd: 03 DW_LNS_advance_line (44) -0x000001df: 05 DW_LNS_set_column (16) -0x000001e1: 01 DW_LNS_copy - 0x0000000000000099 44 16 1 0 0 is_stmt +0x000001d6: 00 DW_LNE_set_address (0x000000000000009b) +0x000001dd: 05 DW_LNS_set_column (18) +0x000001df: 06 DW_LNS_negate_stmt +0x000001e0: 01 DW_LNS_copy + 0x000000000000009b 45 18 1 0 0 -0x000001e2: 00 DW_LNE_set_address (0x00000000000000a2) -0x000001e9: 03 DW_LNS_advance_line (45) -0x000001eb: 05 DW_LNS_set_column (10) -0x000001ed: 01 DW_LNS_copy - 0x00000000000000a2 45 10 1 0 0 is_stmt +0x000001e1: 00 DW_LNE_set_address (0x00000000000000a4) +0x000001e8: 05 DW_LNS_set_column (10) +0x000001ea: 01 DW_LNS_copy + 0x00000000000000a4 45 10 1 0 0 -0x000001ee: 00 DW_LNE_set_address (0x00000000000000a4) -0x000001f5: 05 DW_LNS_set_column (18) -0x000001f7: 06 DW_LNS_negate_stmt -0x000001f8: 01 DW_LNS_copy - 0x00000000000000a4 45 18 1 0 0 +0x000001eb: 00 DW_LNE_set_address (0x00000000000000a6) +0x000001f2: 05 DW_LNS_set_column (23) +0x000001f4: 01 DW_LNS_copy + 0x00000000000000a6 45 23 1 0 0 -0x000001f9: 00 DW_LNE_set_address (0x00000000000000ad) -0x00000200: 05 DW_LNS_set_column (10) -0x00000202: 01 DW_LNS_copy - 0x00000000000000ad 45 10 1 0 0 +0x000001f5: 00 DW_LNE_set_address (0x00000000000000ab) +0x000001fc: 03 DW_LNS_advance_line (44) +0x000001fe: 05 DW_LNS_set_column (16) +0x00000200: 06 DW_LNS_negate_stmt +0x00000201: 01 DW_LNS_copy + 0x00000000000000ab 44 16 1 0 0 is_stmt -0x00000203: 00 DW_LNE_set_address (0x00000000000000af) -0x0000020a: 05 DW_LNS_set_column (23) -0x0000020c: 01 DW_LNS_copy - 0x00000000000000af 45 23 1 0 0 +0x00000202: 00 DW_LNE_set_address (0x00000000000000b8) +0x00000209: 03 DW_LNS_advance_line (46) +0x0000020b: 05 DW_LNS_set_column (11) +0x0000020d: 01 DW_LNS_copy + 0x00000000000000b8 46 11 1 0 0 is_stmt -0x0000020d: 00 DW_LNE_set_address (0x00000000000000b4) -0x00000214: 03 DW_LNS_advance_line (44) -0x00000216: 05 DW_LNS_set_column (16) -0x00000218: 06 DW_LNS_negate_stmt -0x00000219: 01 DW_LNS_copy - 0x00000000000000b4 44 16 1 0 0 is_stmt +0x0000020e: 00 DW_LNE_set_address (0x00000000000000c4) +0x00000215: 05 DW_LNS_set_column (28) +0x00000217: 06 DW_LNS_negate_stmt +0x00000218: 01 DW_LNS_copy + 0x00000000000000c4 46 28 1 0 0 -0x0000021a: 00 DW_LNE_set_address (0x00000000000000c1) -0x00000221: 03 DW_LNS_advance_line (46) -0x00000223: 05 DW_LNS_set_column (11) -0x00000225: 01 DW_LNS_copy - 0x00000000000000c1 46 11 1 0 0 is_stmt +0x00000219: 00 DW_LNE_set_address (0x00000000000000c9) +0x00000220: 05 DW_LNS_set_column (41) +0x00000222: 01 DW_LNS_copy + 0x00000000000000c9 46 41 1 0 0 -0x00000226: 00 DW_LNE_set_address (0x00000000000000cd) -0x0000022d: 05 DW_LNS_set_column (28) -0x0000022f: 06 DW_LNS_negate_stmt -0x00000230: 01 DW_LNS_copy - 0x00000000000000cd 46 28 1 0 0 +0x00000223: 00 DW_LNE_set_address (0x00000000000000ce) +0x0000022a: 03 DW_LNS_advance_line (48) +0x0000022c: 05 DW_LNS_set_column (21) +0x0000022e: 06 DW_LNS_negate_stmt +0x0000022f: 01 DW_LNS_copy + 0x00000000000000ce 48 21 1 0 0 is_stmt -0x00000231: 00 DW_LNE_set_address (0x00000000000000d2) -0x00000238: 05 DW_LNS_set_column (41) -0x0000023a: 01 DW_LNS_copy - 0x00000000000000d2 46 41 1 0 0 +0x00000230: 00 DW_LNE_set_address (0x00000000000000d6) +0x00000237: 03 DW_LNS_advance_line (50) +0x00000239: 05 DW_LNS_set_column (14) +0x0000023b: 01 DW_LNS_copy + 0x00000000000000d6 50 14 1 0 0 is_stmt -0x0000023b: 00 DW_LNE_set_address (0x00000000000000d7) -0x00000242: 03 DW_LNS_advance_line (48) -0x00000244: 05 DW_LNS_set_column (21) -0x00000246: 06 DW_LNS_negate_stmt +0x0000023c: 00 DW_LNE_set_address (0x00000000000000e7) +0x00000243: 03 DW_LNS_advance_line (52) +0x00000245: 05 DW_LNS_set_column (38) 0x00000247: 01 DW_LNS_copy - 0x00000000000000d7 48 21 1 0 0 is_stmt + 0x00000000000000e7 52 38 1 0 0 is_stmt -0x00000248: 00 DW_LNE_set_address (0x00000000000000df) -0x0000024f: 03 DW_LNS_advance_line (50) -0x00000251: 05 DW_LNS_set_column (14) +0x00000248: 00 DW_LNE_set_address (0x00000000000000fb) +0x0000024f: 03 DW_LNS_advance_line (53) +0x00000251: 05 DW_LNS_set_column (22) 0x00000253: 01 DW_LNS_copy - 0x00000000000000df 50 14 1 0 0 is_stmt + 0x00000000000000fb 53 22 1 0 0 is_stmt -0x00000254: 00 DW_LNE_set_address (0x00000000000000f0) -0x0000025b: 03 DW_LNS_advance_line (52) -0x0000025d: 05 DW_LNS_set_column (38) +0x00000254: 00 DW_LNE_set_address (0x000000000000010a) +0x0000025b: 03 DW_LNS_advance_line (54) +0x0000025d: 05 DW_LNS_set_column (24) 0x0000025f: 01 DW_LNS_copy - 0x00000000000000f0 52 38 1 0 0 is_stmt + 0x000000000000010a 54 24 1 0 0 is_stmt -0x00000260: 00 DW_LNE_set_address (0x0000000000000104) -0x00000267: 03 DW_LNS_advance_line (53) -0x00000269: 05 DW_LNS_set_column (22) -0x0000026b: 01 DW_LNS_copy - 0x0000000000000104 53 22 1 0 0 is_stmt +0x00000260: 00 DW_LNE_set_address (0x000000000000010c) +0x00000267: 05 DW_LNS_set_column (26) +0x00000269: 06 DW_LNS_negate_stmt +0x0000026a: 01 DW_LNS_copy + 0x000000000000010c 54 26 1 0 0 -0x0000026c: 00 DW_LNE_set_address (0x0000000000000113) -0x00000273: 03 DW_LNS_advance_line (54) -0x00000275: 05 DW_LNS_set_column (24) -0x00000277: 01 DW_LNS_copy - 0x0000000000000113 54 24 1 0 0 is_stmt +0x0000026b: 00 DW_LNE_set_address (0x0000000000000119) +0x00000272: 05 DW_LNS_set_column (24) +0x00000274: 01 DW_LNS_copy + 0x0000000000000119 54 24 1 0 0 -0x00000278: 00 DW_LNE_set_address (0x0000000000000115) -0x0000027f: 05 DW_LNS_set_column (26) -0x00000281: 06 DW_LNS_negate_stmt -0x00000282: 01 DW_LNS_copy - 0x0000000000000115 54 26 1 0 0 +0x00000275: 00 DW_LNE_set_address (0x000000000000011c) +0x0000027c: 03 DW_LNS_advance_line (55) +0x0000027e: 06 DW_LNS_negate_stmt +0x0000027f: 01 DW_LNS_copy + 0x000000000000011c 55 24 1 0 0 is_stmt -0x00000283: 00 DW_LNE_set_address (0x0000000000000122) -0x0000028a: 05 DW_LNS_set_column (24) -0x0000028c: 01 DW_LNS_copy - 0x0000000000000122 54 24 1 0 0 +0x00000280: 00 DW_LNE_set_address (0x0000000000000123) +0x00000287: 03 DW_LNS_advance_line (52) +0x00000289: 05 DW_LNS_set_column (44) +0x0000028b: 01 DW_LNS_copy + 0x0000000000000123 52 44 1 0 0 is_stmt -0x0000028d: 00 DW_LNE_set_address (0x0000000000000125) -0x00000294: 03 DW_LNS_advance_line (55) -0x00000296: 06 DW_LNS_negate_stmt -0x00000297: 01 DW_LNS_copy - 0x0000000000000125 55 24 1 0 0 is_stmt +0x0000028c: 00 DW_LNE_set_address (0x000000000000012f) +0x00000293: 05 DW_LNS_set_column (38) +0x00000295: 06 DW_LNS_negate_stmt +0x00000296: 01 DW_LNS_copy + 0x000000000000012f 52 38 1 0 0 -0x00000298: 00 DW_LNE_set_address (0x000000000000012c) -0x0000029f: 03 DW_LNS_advance_line (52) -0x000002a1: 05 DW_LNS_set_column (44) -0x000002a3: 01 DW_LNS_copy - 0x000000000000012c 52 44 1 0 0 is_stmt +0x00000297: 00 DW_LNE_set_address (0x0000000000000132) +0x0000029e: 05 DW_LNS_set_column (13) +0x000002a0: 01 DW_LNS_copy + 0x0000000000000132 52 13 1 0 0 -0x000002a4: 00 DW_LNE_set_address (0x0000000000000138) -0x000002ab: 05 DW_LNS_set_column (38) -0x000002ad: 06 DW_LNS_negate_stmt -0x000002ae: 01 DW_LNS_copy - 0x0000000000000138 52 38 1 0 0 +0x000002a1: 00 DW_LNE_set_address (0x0000000000000136) +0x000002a8: 03 DW_LNS_advance_line (58) +0x000002aa: 05 DW_LNS_set_column (19) +0x000002ac: 06 DW_LNS_negate_stmt +0x000002ad: 01 DW_LNS_copy + 0x0000000000000136 58 19 1 0 0 is_stmt -0x000002af: 00 DW_LNE_set_address (0x000000000000013b) -0x000002b6: 05 DW_LNS_set_column (13) -0x000002b8: 01 DW_LNS_copy - 0x000000000000013b 52 13 1 0 0 +0x000002ae: 00 DW_LNE_set_address (0x0000000000000145) +0x000002b5: 03 DW_LNS_advance_line (59) +0x000002b7: 05 DW_LNS_set_column (21) +0x000002b9: 01 DW_LNS_copy + 0x0000000000000145 59 21 1 0 0 is_stmt -0x000002b9: 00 DW_LNE_set_address (0x000000000000013f) -0x000002c0: 03 DW_LNS_advance_line (58) -0x000002c2: 05 DW_LNS_set_column (19) -0x000002c4: 06 DW_LNS_negate_stmt +0x000002ba: 00 DW_LNE_set_address (0x000000000000014c) +0x000002c1: 03 DW_LNS_advance_line (57) +0x000002c3: 05 DW_LNS_set_column (18) 0x000002c5: 01 DW_LNS_copy - 0x000000000000013f 58 19 1 0 0 is_stmt + 0x000000000000014c 57 18 1 0 0 is_stmt -0x000002c6: 00 DW_LNE_set_address (0x000000000000014e) -0x000002cd: 03 DW_LNS_advance_line (59) -0x000002cf: 05 DW_LNS_set_column (21) +0x000002c6: 00 DW_LNE_set_address (0x000000000000015c) +0x000002cd: 03 DW_LNS_advance_line (62) +0x000002cf: 05 DW_LNS_set_column (14) 0x000002d1: 01 DW_LNS_copy - 0x000000000000014e 59 21 1 0 0 is_stmt + 0x000000000000015c 62 14 1 0 0 is_stmt -0x000002d2: 00 DW_LNE_set_address (0x0000000000000155) -0x000002d9: 03 DW_LNS_advance_line (57) -0x000002db: 05 DW_LNS_set_column (18) -0x000002dd: 01 DW_LNS_copy - 0x0000000000000155 57 18 1 0 0 is_stmt +0x000002d2: 00 DW_LNE_set_address (0x0000000000000160) +0x000002d9: 05 DW_LNS_set_column (23) +0x000002db: 06 DW_LNS_negate_stmt +0x000002dc: 01 DW_LNS_copy + 0x0000000000000160 62 23 1 0 0 -0x000002de: 00 DW_LNE_set_address (0x0000000000000165) -0x000002e5: 03 DW_LNS_advance_line (62) -0x000002e7: 05 DW_LNS_set_column (14) -0x000002e9: 01 DW_LNS_copy - 0x0000000000000165 62 14 1 0 0 is_stmt +0x000002dd: 00 DW_LNE_set_address (0x0000000000000165) +0x000002e4: 05 DW_LNS_set_column (14) +0x000002e6: 01 DW_LNS_copy + 0x0000000000000165 62 14 1 0 0 -0x000002ea: 00 DW_LNE_set_address (0x0000000000000169) -0x000002f1: 05 DW_LNS_set_column (23) -0x000002f3: 06 DW_LNS_negate_stmt -0x000002f4: 01 DW_LNS_copy - 0x0000000000000169 62 23 1 0 0 +0x000002e7: 00 DW_LNE_set_address (0x0000000000000169) +0x000002ee: 03 DW_LNS_advance_line (66) +0x000002f0: 05 DW_LNS_set_column (16) +0x000002f2: 06 DW_LNS_negate_stmt +0x000002f3: 01 DW_LNS_copy + 0x0000000000000169 66 16 1 0 0 is_stmt -0x000002f5: 00 DW_LNE_set_address (0x000000000000016e) -0x000002fc: 05 DW_LNS_set_column (14) -0x000002fe: 01 DW_LNS_copy - 0x000000000000016e 62 14 1 0 0 +0x000002f4: 00 DW_LNE_set_address (0x0000000000000176) +0x000002fb: 03 DW_LNS_advance_line (75) +0x000002fd: 05 DW_LNS_set_column (27) +0x000002ff: 01 DW_LNS_copy + 0x0000000000000176 75 27 1 0 0 is_stmt -0x000002ff: 00 DW_LNE_set_address (0x0000000000000172) -0x00000306: 03 DW_LNS_advance_line (66) -0x00000308: 05 DW_LNS_set_column (16) -0x0000030a: 06 DW_LNS_negate_stmt +0x00000300: 00 DW_LNE_set_address (0x000000000000017f) +0x00000307: 03 DW_LNS_advance_line (76) +0x00000309: 05 DW_LNS_set_column (16) 0x0000030b: 01 DW_LNS_copy - 0x0000000000000172 66 16 1 0 0 is_stmt + 0x000000000000017f 76 16 1 0 0 is_stmt -0x0000030c: 00 DW_LNE_set_address (0x000000000000017f) -0x00000313: 03 DW_LNS_advance_line (75) -0x00000315: 05 DW_LNS_set_column (27) -0x00000317: 01 DW_LNS_copy - 0x000000000000017f 75 27 1 0 0 is_stmt +0x0000030c: 00 DW_LNE_set_address (0x0000000000000187) +0x00000313: 05 DW_LNS_set_column (27) +0x00000315: 06 DW_LNS_negate_stmt +0x00000316: 01 DW_LNS_copy + 0x0000000000000187 76 27 1 0 0 -0x00000318: 00 DW_LNE_set_address (0x0000000000000188) -0x0000031f: 03 DW_LNS_advance_line (76) -0x00000321: 05 DW_LNS_set_column (16) -0x00000323: 01 DW_LNS_copy - 0x0000000000000188 76 16 1 0 0 is_stmt +0x00000317: 00 DW_LNE_set_address (0x0000000000000189) +0x0000031e: 05 DW_LNS_set_column (35) +0x00000320: 01 DW_LNS_copy + 0x0000000000000189 76 35 1 0 0 -0x00000324: 00 DW_LNE_set_address (0x0000000000000190) -0x0000032b: 05 DW_LNS_set_column (27) -0x0000032d: 06 DW_LNS_negate_stmt -0x0000032e: 01 DW_LNS_copy - 0x0000000000000190 76 27 1 0 0 +0x00000321: 00 DW_LNE_set_address (0x0000000000000192) +0x00000328: 05 DW_LNS_set_column (27) +0x0000032a: 01 DW_LNS_copy + 0x0000000000000192 76 27 1 0 0 -0x0000032f: 00 DW_LNE_set_address (0x0000000000000192) -0x00000336: 05 DW_LNS_set_column (35) -0x00000338: 01 DW_LNS_copy - 0x0000000000000192 76 35 1 0 0 +0x0000032b: 00 DW_LNE_set_address (0x0000000000000197) +0x00000332: 05 DW_LNS_set_column (25) +0x00000334: 01 DW_LNS_copy + 0x0000000000000197 76 25 1 0 0 -0x00000339: 00 DW_LNE_set_address (0x000000000000019b) -0x00000340: 05 DW_LNS_set_column (27) -0x00000342: 01 DW_LNS_copy - 0x000000000000019b 76 27 1 0 0 +0x00000335: 00 DW_LNE_set_address (0x000000000000019a) +0x0000033c: 03 DW_LNS_advance_line (75) +0x0000033e: 05 DW_LNS_set_column (27) +0x00000340: 06 DW_LNS_negate_stmt +0x00000341: 01 DW_LNS_copy + 0x000000000000019a 75 27 1 0 0 is_stmt -0x00000343: 00 DW_LNE_set_address (0x00000000000001a0) -0x0000034a: 05 DW_LNS_set_column (25) +0x00000342: 00 DW_LNE_set_address (0x000000000000019f) +0x00000349: 05 DW_LNS_set_column (13) +0x0000034b: 06 DW_LNS_negate_stmt 0x0000034c: 01 DW_LNS_copy - 0x00000000000001a0 76 25 1 0 0 + 0x000000000000019f 75 13 1 0 0 -0x0000034d: 00 DW_LNE_set_address (0x00000000000001a3) -0x00000354: 03 DW_LNS_advance_line (75) -0x00000356: 05 DW_LNS_set_column (27) -0x00000358: 06 DW_LNS_negate_stmt -0x00000359: 01 DW_LNS_copy - 0x00000000000001a3 75 27 1 0 0 is_stmt +0x0000034d: 00 DW_LNE_set_address (0x00000000000001a7) +0x00000354: 03 DW_LNS_advance_line (77) +0x00000356: 06 DW_LNS_negate_stmt +0x00000357: 01 DW_LNS_copy + 0x00000000000001a7 77 13 1 0 0 is_stmt -0x0000035a: 00 DW_LNE_set_address (0x00000000000001a8) -0x00000361: 05 DW_LNS_set_column (13) -0x00000363: 06 DW_LNS_negate_stmt -0x00000364: 01 DW_LNS_copy - 0x00000000000001a8 75 13 1 0 0 +0x00000358: 00 DW_LNE_set_address (0x00000000000001af) +0x0000035f: 05 DW_LNS_set_column (22) +0x00000361: 06 DW_LNS_negate_stmt +0x00000362: 01 DW_LNS_copy + 0x00000000000001af 77 22 1 0 0 -0x00000365: 00 DW_LNE_set_address (0x00000000000001b0) -0x0000036c: 03 DW_LNS_advance_line (77) +0x00000363: 00 DW_LNE_set_address (0x00000000000001b4) +0x0000036a: 03 DW_LNS_advance_line (79) +0x0000036c: 05 DW_LNS_set_column (16) 0x0000036e: 06 DW_LNS_negate_stmt 0x0000036f: 01 DW_LNS_copy - 0x00000000000001b0 77 13 1 0 0 is_stmt + 0x00000000000001b4 79 16 1 0 0 is_stmt -0x00000370: 00 DW_LNE_set_address (0x00000000000001b8) -0x00000377: 05 DW_LNS_set_column (22) +0x00000370: 00 DW_LNE_set_address (0x00000000000001bc) +0x00000377: 05 DW_LNS_set_column (14) 0x00000379: 06 DW_LNS_negate_stmt 0x0000037a: 01 DW_LNS_copy - 0x00000000000001b8 77 22 1 0 0 + 0x00000000000001bc 79 14 1 0 0 -0x0000037b: 00 DW_LNE_set_address (0x00000000000001bd) -0x00000382: 03 DW_LNS_advance_line (79) -0x00000384: 05 DW_LNS_set_column (16) -0x00000386: 06 DW_LNS_negate_stmt -0x00000387: 01 DW_LNS_copy - 0x00000000000001bd 79 16 1 0 0 is_stmt +0x0000037b: 00 DW_LNE_set_address (0x00000000000001cb) +0x00000382: 05 DW_LNS_set_column (25) +0x00000384: 01 DW_LNS_copy + 0x00000000000001cb 79 25 1 0 0 -0x00000388: 00 DW_LNE_set_address (0x00000000000001c5) -0x0000038f: 05 DW_LNS_set_column (14) -0x00000391: 06 DW_LNS_negate_stmt -0x00000392: 01 DW_LNS_copy - 0x00000000000001c5 79 14 1 0 0 +0x00000385: 00 DW_LNE_set_address (0x00000000000001d2) +0x0000038c: 03 DW_LNS_advance_line (81) +0x0000038e: 05 DW_LNS_set_column (11) +0x00000390: 06 DW_LNS_negate_stmt +0x00000391: 01 DW_LNS_copy + 0x00000000000001d2 81 11 1 0 0 is_stmt -0x00000393: 00 DW_LNE_set_address (0x00000000000001d4) -0x0000039a: 05 DW_LNS_set_column (25) -0x0000039c: 01 DW_LNS_copy - 0x00000000000001d4 79 25 1 0 0 +0x00000392: 00 DW_LNE_set_address (0x00000000000001d7) +0x00000399: 03 DW_LNS_advance_line (66) +0x0000039b: 05 DW_LNS_set_column (16) +0x0000039d: 01 DW_LNS_copy + 0x00000000000001d7 66 16 1 0 0 is_stmt -0x0000039d: 00 DW_LNE_set_address (0x00000000000001db) -0x000003a4: 03 DW_LNS_advance_line (81) -0x000003a6: 05 DW_LNS_set_column (11) -0x000003a8: 06 DW_LNS_negate_stmt +0x0000039e: 00 DW_LNE_set_address (0x00000000000001de) +0x000003a5: 03 DW_LNS_advance_line (74) +0x000003a7: 05 DW_LNS_set_column (22) 0x000003a9: 01 DW_LNS_copy - 0x00000000000001db 81 11 1 0 0 is_stmt + 0x00000000000001de 74 22 1 0 0 is_stmt -0x000003aa: 00 DW_LNE_set_address (0x00000000000001e0) -0x000003b1: 03 DW_LNS_advance_line (66) -0x000003b3: 05 DW_LNS_set_column (16) +0x000003aa: 00 DW_LNE_set_address (0x00000000000001e7) +0x000003b1: 03 DW_LNS_advance_line (37) +0x000003b3: 05 DW_LNS_set_column (4) 0x000003b5: 01 DW_LNS_copy - 0x00000000000001e0 66 16 1 0 0 is_stmt + 0x00000000000001e7 37 4 1 0 0 is_stmt -0x000003b6: 00 DW_LNE_set_address (0x00000000000001e7) -0x000003bd: 03 DW_LNS_advance_line (74) -0x000003bf: 05 DW_LNS_set_column (22) -0x000003c1: 01 DW_LNS_copy - 0x00000000000001e7 74 22 1 0 0 is_stmt +0x000003b6: 00 DW_LNE_set_address (0x00000000000001ec) +0x000003bd: 03 DW_LNS_advance_line (39) +0x000003bf: 01 DW_LNS_copy + 0x00000000000001ec 39 4 1 0 0 is_stmt -0x000003c2: 00 DW_LNE_set_address (0x00000000000001f0) -0x000003c9: 03 DW_LNS_advance_line (37) -0x000003cb: 05 DW_LNS_set_column (4) -0x000003cd: 01 DW_LNS_copy - 0x00000000000001f0 37 4 1 0 0 is_stmt +0x000003c0: 00 DW_LNE_set_address (0x00000000000001ee) +0x000003c7: 05 DW_LNS_set_column (16) +0x000003c9: 06 DW_LNS_negate_stmt +0x000003ca: 01 DW_LNS_copy + 0x00000000000001ee 39 16 1 0 0 -0x000003ce: 00 DW_LNE_set_address (0x00000000000001f5) -0x000003d5: 03 DW_LNS_advance_line (39) -0x000003d7: 01 DW_LNS_copy - 0x00000000000001f5 39 4 1 0 0 is_stmt +0x000003cb: 00 DW_LNE_set_address (0x00000000000001f7) +0x000003d2: 05 DW_LNS_set_column (4) +0x000003d4: 01 DW_LNS_copy + 0x00000000000001f7 39 4 1 0 0 -0x000003d8: 00 DW_LNE_set_address (0x00000000000001f7) -0x000003df: 05 DW_LNS_set_column (16) -0x000003e1: 06 DW_LNS_negate_stmt -0x000003e2: 01 DW_LNS_copy - 0x00000000000001f7 39 16 1 0 0 +0x000003d5: 00 DW_LNE_set_address (0x00000000000001f9) +0x000003dc: 05 DW_LNS_set_column (23) +0x000003de: 01 DW_LNS_copy + 0x00000000000001f9 39 23 1 0 0 -0x000003e3: 00 DW_LNE_set_address (0x0000000000000200) -0x000003ea: 05 DW_LNS_set_column (4) -0x000003ec: 01 DW_LNS_copy - 0x0000000000000200 39 4 1 0 0 +0x000003df: 00 DW_LNE_set_address (0x00000000000001fe) +0x000003e6: 05 DW_LNS_set_column (19) +0x000003e8: 01 DW_LNS_copy + 0x00000000000001fe 39 19 1 0 0 -0x000003ed: 00 DW_LNE_set_address (0x0000000000000202) -0x000003f4: 05 DW_LNS_set_column (23) -0x000003f6: 01 DW_LNS_copy - 0x0000000000000202 39 23 1 0 0 +0x000003e9: 00 DW_LNE_set_address (0x0000000000000203) +0x000003f0: 03 DW_LNS_advance_line (40) +0x000003f2: 05 DW_LNS_set_column (4) +0x000003f4: 06 DW_LNS_negate_stmt +0x000003f5: 01 DW_LNS_copy + 0x0000000000000203 40 4 1 0 0 is_stmt -0x000003f7: 00 DW_LNE_set_address (0x0000000000000207) -0x000003fe: 05 DW_LNS_set_column (19) +0x000003f6: 00 DW_LNE_set_address (0x000000000000020b) +0x000003fd: 05 DW_LNS_set_column (17) +0x000003ff: 06 DW_LNS_negate_stmt 0x00000400: 01 DW_LNS_copy - 0x0000000000000207 39 19 1 0 0 + 0x000000000000020b 40 17 1 0 0 -0x00000401: 00 DW_LNE_set_address (0x000000000000020c) -0x00000408: 03 DW_LNS_advance_line (40) -0x0000040a: 05 DW_LNS_set_column (4) +0x00000401: 00 DW_LNE_set_address (0x0000000000000214) +0x00000408: 03 DW_LNS_advance_line (44) +0x0000040a: 05 DW_LNS_set_column (16) 0x0000040c: 06 DW_LNS_negate_stmt 0x0000040d: 01 DW_LNS_copy - 0x000000000000020c 40 4 1 0 0 is_stmt + 0x0000000000000214 44 16 1 0 0 is_stmt -0x0000040e: 00 DW_LNE_set_address (0x0000000000000214) -0x00000415: 05 DW_LNS_set_column (17) -0x00000417: 06 DW_LNS_negate_stmt -0x00000418: 01 DW_LNS_copy - 0x0000000000000214 40 17 1 0 0 +0x0000040e: 00 DW_LNE_set_address (0x000000000000021d) +0x00000415: 03 DW_LNS_advance_line (45) +0x00000417: 05 DW_LNS_set_column (10) +0x00000419: 01 DW_LNS_copy + 0x000000000000021d 45 10 1 0 0 is_stmt -0x00000419: 00 DW_LNE_set_address (0x000000000000021e) -0x00000420: 03 DW_LNS_advance_line (44) -0x00000422: 05 DW_LNS_set_column (16) -0x00000424: 06 DW_LNS_negate_stmt -0x00000425: 01 DW_LNS_copy - 0x000000000000021e 44 16 1 0 0 is_stmt +0x0000041a: 00 DW_LNE_set_address (0x000000000000021f) +0x00000421: 05 DW_LNS_set_column (18) +0x00000423: 06 DW_LNS_negate_stmt +0x00000424: 01 DW_LNS_copy + 0x000000000000021f 45 18 1 0 0 -0x00000426: 00 DW_LNE_set_address (0x0000000000000227) -0x0000042d: 03 DW_LNS_advance_line (45) -0x0000042f: 05 DW_LNS_set_column (10) -0x00000431: 01 DW_LNS_copy - 0x0000000000000227 45 10 1 0 0 is_stmt +0x00000425: 00 DW_LNE_set_address (0x0000000000000228) +0x0000042c: 05 DW_LNS_set_column (10) +0x0000042e: 01 DW_LNS_copy + 0x0000000000000228 45 10 1 0 0 -0x00000432: 00 DW_LNE_set_address (0x0000000000000229) -0x00000439: 05 DW_LNS_set_column (18) -0x0000043b: 06 DW_LNS_negate_stmt -0x0000043c: 01 DW_LNS_copy - 0x0000000000000229 45 18 1 0 0 +0x0000042f: 00 DW_LNE_set_address (0x000000000000022a) +0x00000436: 05 DW_LNS_set_column (23) +0x00000438: 01 DW_LNS_copy + 0x000000000000022a 45 23 1 0 0 -0x0000043d: 00 DW_LNE_set_address (0x0000000000000232) -0x00000444: 05 DW_LNS_set_column (10) -0x00000446: 01 DW_LNS_copy - 0x0000000000000232 45 10 1 0 0 +0x00000439: 00 DW_LNE_set_address (0x000000000000022f) +0x00000440: 03 DW_LNS_advance_line (44) +0x00000442: 05 DW_LNS_set_column (16) +0x00000444: 06 DW_LNS_negate_stmt +0x00000445: 01 DW_LNS_copy + 0x000000000000022f 44 16 1 0 0 is_stmt -0x00000447: 00 DW_LNE_set_address (0x0000000000000234) -0x0000044e: 05 DW_LNS_set_column (23) -0x00000450: 01 DW_LNS_copy - 0x0000000000000234 45 23 1 0 0 +0x00000446: 00 DW_LNE_set_address (0x000000000000023c) +0x0000044d: 03 DW_LNS_advance_line (46) +0x0000044f: 05 DW_LNS_set_column (11) +0x00000451: 01 DW_LNS_copy + 0x000000000000023c 46 11 1 0 0 is_stmt -0x00000451: 00 DW_LNE_set_address (0x0000000000000239) -0x00000458: 03 DW_LNS_advance_line (44) -0x0000045a: 05 DW_LNS_set_column (16) -0x0000045c: 06 DW_LNS_negate_stmt -0x0000045d: 01 DW_LNS_copy - 0x0000000000000239 44 16 1 0 0 is_stmt +0x00000452: 00 DW_LNE_set_address (0x0000000000000248) +0x00000459: 05 DW_LNS_set_column (28) +0x0000045b: 06 DW_LNS_negate_stmt +0x0000045c: 01 DW_LNS_copy + 0x0000000000000248 46 28 1 0 0 -0x0000045e: 00 DW_LNE_set_address (0x0000000000000246) -0x00000465: 03 DW_LNS_advance_line (46) -0x00000467: 05 DW_LNS_set_column (11) -0x00000469: 01 DW_LNS_copy - 0x0000000000000246 46 11 1 0 0 is_stmt +0x0000045d: 00 DW_LNE_set_address (0x000000000000024d) +0x00000464: 05 DW_LNS_set_column (41) +0x00000466: 01 DW_LNS_copy + 0x000000000000024d 46 41 1 0 0 -0x0000046a: 00 DW_LNE_set_address (0x0000000000000252) -0x00000471: 05 DW_LNS_set_column (28) -0x00000473: 06 DW_LNS_negate_stmt -0x00000474: 01 DW_LNS_copy - 0x0000000000000252 46 28 1 0 0 +0x00000467: 00 DW_LNE_set_address (0x0000000000000252) +0x0000046e: 03 DW_LNS_advance_line (50) +0x00000470: 05 DW_LNS_set_column (14) +0x00000472: 06 DW_LNS_negate_stmt +0x00000473: 01 DW_LNS_copy + 0x0000000000000252 50 14 1 0 0 is_stmt -0x00000475: 00 DW_LNE_set_address (0x0000000000000257) -0x0000047c: 05 DW_LNS_set_column (41) -0x0000047e: 01 DW_LNS_copy - 0x0000000000000257 46 41 1 0 0 +0x00000474: 00 DW_LNE_set_address (0x0000000000000263) +0x0000047b: 03 DW_LNS_advance_line (52) +0x0000047d: 05 DW_LNS_set_column (38) +0x0000047f: 01 DW_LNS_copy + 0x0000000000000263 52 38 1 0 0 is_stmt -0x0000047f: 00 DW_LNE_set_address (0x000000000000025c) -0x00000486: 03 DW_LNS_advance_line (50) -0x00000488: 05 DW_LNS_set_column (14) -0x0000048a: 06 DW_LNS_negate_stmt +0x00000480: 00 DW_LNE_set_address (0x0000000000000277) +0x00000487: 03 DW_LNS_advance_line (53) +0x00000489: 05 DW_LNS_set_column (22) 0x0000048b: 01 DW_LNS_copy - 0x000000000000025c 50 14 1 0 0 is_stmt + 0x0000000000000277 53 22 1 0 0 is_stmt -0x0000048c: 00 DW_LNE_set_address (0x000000000000026d) -0x00000493: 03 DW_LNS_advance_line (52) -0x00000495: 05 DW_LNS_set_column (38) +0x0000048c: 00 DW_LNE_set_address (0x0000000000000286) +0x00000493: 03 DW_LNS_advance_line (54) +0x00000495: 05 DW_LNS_set_column (24) 0x00000497: 01 DW_LNS_copy - 0x000000000000026d 52 38 1 0 0 is_stmt + 0x0000000000000286 54 24 1 0 0 is_stmt -0x00000498: 00 DW_LNE_set_address (0x0000000000000281) -0x0000049f: 03 DW_LNS_advance_line (53) -0x000004a1: 05 DW_LNS_set_column (22) -0x000004a3: 01 DW_LNS_copy - 0x0000000000000281 53 22 1 0 0 is_stmt +0x00000498: 00 DW_LNE_set_address (0x0000000000000288) +0x0000049f: 05 DW_LNS_set_column (26) +0x000004a1: 06 DW_LNS_negate_stmt +0x000004a2: 01 DW_LNS_copy + 0x0000000000000288 54 26 1 0 0 -0x000004a4: 00 DW_LNE_set_address (0x0000000000000290) -0x000004ab: 03 DW_LNS_advance_line (54) -0x000004ad: 05 DW_LNS_set_column (24) -0x000004af: 01 DW_LNS_copy - 0x0000000000000290 54 24 1 0 0 is_stmt +0x000004a3: 00 DW_LNE_set_address (0x0000000000000295) +0x000004aa: 05 DW_LNS_set_column (24) +0x000004ac: 01 DW_LNS_copy + 0x0000000000000295 54 24 1 0 0 -0x000004b0: 00 DW_LNE_set_address (0x0000000000000292) -0x000004b7: 05 DW_LNS_set_column (26) -0x000004b9: 06 DW_LNS_negate_stmt -0x000004ba: 01 DW_LNS_copy - 0x0000000000000292 54 26 1 0 0 +0x000004ad: 00 DW_LNE_set_address (0x0000000000000298) +0x000004b4: 03 DW_LNS_advance_line (55) +0x000004b6: 06 DW_LNS_negate_stmt +0x000004b7: 01 DW_LNS_copy + 0x0000000000000298 55 24 1 0 0 is_stmt -0x000004bb: 00 DW_LNE_set_address (0x000000000000029f) -0x000004c2: 05 DW_LNS_set_column (24) -0x000004c4: 01 DW_LNS_copy - 0x000000000000029f 54 24 1 0 0 +0x000004b8: 00 DW_LNE_set_address (0x000000000000029f) +0x000004bf: 03 DW_LNS_advance_line (52) +0x000004c1: 05 DW_LNS_set_column (44) +0x000004c3: 01 DW_LNS_copy + 0x000000000000029f 52 44 1 0 0 is_stmt -0x000004c5: 00 DW_LNE_set_address (0x00000000000002a2) -0x000004cc: 03 DW_LNS_advance_line (55) -0x000004ce: 06 DW_LNS_negate_stmt -0x000004cf: 01 DW_LNS_copy - 0x00000000000002a2 55 24 1 0 0 is_stmt +0x000004c4: 00 DW_LNE_set_address (0x00000000000002ab) +0x000004cb: 05 DW_LNS_set_column (38) +0x000004cd: 06 DW_LNS_negate_stmt +0x000004ce: 01 DW_LNS_copy + 0x00000000000002ab 52 38 1 0 0 -0x000004d0: 00 DW_LNE_set_address (0x00000000000002a9) -0x000004d7: 03 DW_LNS_advance_line (52) -0x000004d9: 05 DW_LNS_set_column (44) +0x000004cf: 00 DW_LNE_set_address (0x00000000000002b2) +0x000004d6: 03 DW_LNS_advance_line (58) +0x000004d8: 05 DW_LNS_set_column (19) +0x000004da: 06 DW_LNS_negate_stmt 0x000004db: 01 DW_LNS_copy - 0x00000000000002a9 52 44 1 0 0 is_stmt + 0x00000000000002b2 58 19 1 0 0 is_stmt -0x000004dc: 00 DW_LNE_set_address (0x00000000000002b5) -0x000004e3: 05 DW_LNS_set_column (38) -0x000004e5: 06 DW_LNS_negate_stmt -0x000004e6: 01 DW_LNS_copy - 0x00000000000002b5 52 38 1 0 0 +0x000004dc: 00 DW_LNE_set_address (0x00000000000002c1) +0x000004e3: 03 DW_LNS_advance_line (59) +0x000004e5: 05 DW_LNS_set_column (21) +0x000004e7: 01 DW_LNS_copy + 0x00000000000002c1 59 21 1 0 0 is_stmt -0x000004e7: 00 DW_LNE_set_address (0x00000000000002bc) -0x000004ee: 03 DW_LNS_advance_line (58) -0x000004f0: 05 DW_LNS_set_column (19) -0x000004f2: 06 DW_LNS_negate_stmt +0x000004e8: 00 DW_LNE_set_address (0x00000000000002c8) +0x000004ef: 03 DW_LNS_advance_line (57) +0x000004f1: 05 DW_LNS_set_column (18) 0x000004f3: 01 DW_LNS_copy - 0x00000000000002bc 58 19 1 0 0 is_stmt + 0x00000000000002c8 57 18 1 0 0 is_stmt -0x000004f4: 00 DW_LNE_set_address (0x00000000000002cb) -0x000004fb: 03 DW_LNS_advance_line (59) -0x000004fd: 05 DW_LNS_set_column (21) +0x000004f4: 00 DW_LNE_set_address (0x00000000000002d8) +0x000004fb: 03 DW_LNS_advance_line (62) +0x000004fd: 05 DW_LNS_set_column (14) 0x000004ff: 01 DW_LNS_copy - 0x00000000000002cb 59 21 1 0 0 is_stmt + 0x00000000000002d8 62 14 1 0 0 is_stmt -0x00000500: 00 DW_LNE_set_address (0x00000000000002d2) -0x00000507: 03 DW_LNS_advance_line (57) -0x00000509: 05 DW_LNS_set_column (18) -0x0000050b: 01 DW_LNS_copy - 0x00000000000002d2 57 18 1 0 0 is_stmt +0x00000500: 00 DW_LNE_set_address (0x00000000000002dc) +0x00000507: 05 DW_LNS_set_column (23) +0x00000509: 06 DW_LNS_negate_stmt +0x0000050a: 01 DW_LNS_copy + 0x00000000000002dc 62 23 1 0 0 -0x0000050c: 00 DW_LNE_set_address (0x00000000000002e2) -0x00000513: 03 DW_LNS_advance_line (62) -0x00000515: 05 DW_LNS_set_column (14) -0x00000517: 01 DW_LNS_copy - 0x00000000000002e2 62 14 1 0 0 is_stmt +0x0000050b: 00 DW_LNE_set_address (0x00000000000002e1) +0x00000512: 05 DW_LNS_set_column (14) +0x00000514: 01 DW_LNS_copy + 0x00000000000002e1 62 14 1 0 0 -0x00000518: 00 DW_LNE_set_address (0x00000000000002e6) -0x0000051f: 05 DW_LNS_set_column (23) -0x00000521: 06 DW_LNS_negate_stmt -0x00000522: 01 DW_LNS_copy - 0x00000000000002e6 62 23 1 0 0 +0x00000515: 00 DW_LNE_set_address (0x00000000000002e5) +0x0000051c: 03 DW_LNS_advance_line (66) +0x0000051e: 05 DW_LNS_set_column (16) +0x00000520: 06 DW_LNS_negate_stmt +0x00000521: 01 DW_LNS_copy + 0x00000000000002e5 66 16 1 0 0 is_stmt -0x00000523: 00 DW_LNE_set_address (0x00000000000002eb) -0x0000052a: 05 DW_LNS_set_column (14) -0x0000052c: 01 DW_LNS_copy - 0x00000000000002eb 62 14 1 0 0 +0x00000522: 00 DW_LNE_set_address (0x00000000000002f2) +0x00000529: 03 DW_LNS_advance_line (75) +0x0000052b: 05 DW_LNS_set_column (27) +0x0000052d: 01 DW_LNS_copy + 0x00000000000002f2 75 27 1 0 0 is_stmt -0x0000052d: 00 DW_LNE_set_address (0x00000000000002ef) -0x00000534: 03 DW_LNS_advance_line (66) -0x00000536: 05 DW_LNS_set_column (16) -0x00000538: 06 DW_LNS_negate_stmt +0x0000052e: 00 DW_LNE_set_address (0x00000000000002fb) +0x00000535: 03 DW_LNS_advance_line (76) +0x00000537: 05 DW_LNS_set_column (16) 0x00000539: 01 DW_LNS_copy - 0x00000000000002ef 66 16 1 0 0 is_stmt + 0x00000000000002fb 76 16 1 0 0 is_stmt -0x0000053a: 00 DW_LNE_set_address (0x00000000000002fc) -0x00000541: 03 DW_LNS_advance_line (75) -0x00000543: 05 DW_LNS_set_column (27) -0x00000545: 01 DW_LNS_copy - 0x00000000000002fc 75 27 1 0 0 is_stmt +0x0000053a: 00 DW_LNE_set_address (0x0000000000000303) +0x00000541: 05 DW_LNS_set_column (27) +0x00000543: 06 DW_LNS_negate_stmt +0x00000544: 01 DW_LNS_copy + 0x0000000000000303 76 27 1 0 0 -0x00000546: 00 DW_LNE_set_address (0x0000000000000305) -0x0000054d: 03 DW_LNS_advance_line (76) -0x0000054f: 05 DW_LNS_set_column (16) -0x00000551: 01 DW_LNS_copy - 0x0000000000000305 76 16 1 0 0 is_stmt +0x00000545: 00 DW_LNE_set_address (0x0000000000000305) +0x0000054c: 05 DW_LNS_set_column (35) +0x0000054e: 01 DW_LNS_copy + 0x0000000000000305 76 35 1 0 0 -0x00000552: 00 DW_LNE_set_address (0x000000000000030d) -0x00000559: 05 DW_LNS_set_column (27) -0x0000055b: 06 DW_LNS_negate_stmt -0x0000055c: 01 DW_LNS_copy - 0x000000000000030d 76 27 1 0 0 +0x0000054f: 00 DW_LNE_set_address (0x000000000000030e) +0x00000556: 05 DW_LNS_set_column (27) +0x00000558: 01 DW_LNS_copy + 0x000000000000030e 76 27 1 0 0 -0x0000055d: 00 DW_LNE_set_address (0x000000000000030f) -0x00000564: 05 DW_LNS_set_column (35) -0x00000566: 01 DW_LNS_copy - 0x000000000000030f 76 35 1 0 0 +0x00000559: 00 DW_LNE_set_address (0x0000000000000313) +0x00000560: 05 DW_LNS_set_column (25) +0x00000562: 01 DW_LNS_copy + 0x0000000000000313 76 25 1 0 0 -0x00000567: 00 DW_LNE_set_address (0x0000000000000318) -0x0000056e: 05 DW_LNS_set_column (27) -0x00000570: 01 DW_LNS_copy - 0x0000000000000318 76 27 1 0 0 +0x00000563: 00 DW_LNE_set_address (0x0000000000000316) +0x0000056a: 03 DW_LNS_advance_line (75) +0x0000056c: 05 DW_LNS_set_column (27) +0x0000056e: 06 DW_LNS_negate_stmt +0x0000056f: 01 DW_LNS_copy + 0x0000000000000316 75 27 1 0 0 is_stmt -0x00000571: 00 DW_LNE_set_address (0x000000000000031d) -0x00000578: 05 DW_LNS_set_column (25) -0x0000057a: 01 DW_LNS_copy - 0x000000000000031d 76 25 1 0 0 +0x00000570: 00 DW_LNE_set_address (0x0000000000000323) +0x00000577: 03 DW_LNS_advance_line (77) +0x00000579: 05 DW_LNS_set_column (13) +0x0000057b: 01 DW_LNS_copy + 0x0000000000000323 77 13 1 0 0 is_stmt -0x0000057b: 00 DW_LNE_set_address (0x0000000000000320) -0x00000582: 03 DW_LNS_advance_line (75) -0x00000584: 05 DW_LNS_set_column (27) -0x00000586: 06 DW_LNS_negate_stmt -0x00000587: 01 DW_LNS_copy - 0x0000000000000320 75 27 1 0 0 is_stmt +0x0000057c: 00 DW_LNE_set_address (0x000000000000032b) +0x00000583: 05 DW_LNS_set_column (22) +0x00000585: 06 DW_LNS_negate_stmt +0x00000586: 01 DW_LNS_copy + 0x000000000000032b 77 22 1 0 0 -0x00000588: 00 DW_LNE_set_address (0x000000000000032d) -0x0000058f: 03 DW_LNS_advance_line (77) -0x00000591: 05 DW_LNS_set_column (13) +0x00000587: 00 DW_LNE_set_address (0x0000000000000330) +0x0000058e: 03 DW_LNS_advance_line (79) +0x00000590: 05 DW_LNS_set_column (16) +0x00000592: 06 DW_LNS_negate_stmt 0x00000593: 01 DW_LNS_copy - 0x000000000000032d 77 13 1 0 0 is_stmt + 0x0000000000000330 79 16 1 0 0 is_stmt -0x00000594: 00 DW_LNE_set_address (0x0000000000000335) -0x0000059b: 05 DW_LNS_set_column (22) +0x00000594: 00 DW_LNE_set_address (0x0000000000000338) +0x0000059b: 05 DW_LNS_set_column (14) 0x0000059d: 06 DW_LNS_negate_stmt 0x0000059e: 01 DW_LNS_copy - 0x0000000000000335 77 22 1 0 0 + 0x0000000000000338 79 14 1 0 0 -0x0000059f: 00 DW_LNE_set_address (0x000000000000033a) -0x000005a6: 03 DW_LNS_advance_line (79) -0x000005a8: 05 DW_LNS_set_column (16) -0x000005aa: 06 DW_LNS_negate_stmt -0x000005ab: 01 DW_LNS_copy - 0x000000000000033a 79 16 1 0 0 is_stmt +0x0000059f: 00 DW_LNE_set_address (0x0000000000000347) +0x000005a6: 05 DW_LNS_set_column (25) +0x000005a8: 01 DW_LNS_copy + 0x0000000000000347 79 25 1 0 0 -0x000005ac: 00 DW_LNE_set_address (0x0000000000000342) -0x000005b3: 05 DW_LNS_set_column (14) -0x000005b5: 06 DW_LNS_negate_stmt -0x000005b6: 01 DW_LNS_copy - 0x0000000000000342 79 14 1 0 0 +0x000005a9: 00 DW_LNE_set_address (0x000000000000034e) +0x000005b0: 03 DW_LNS_advance_line (81) +0x000005b2: 05 DW_LNS_set_column (11) +0x000005b4: 06 DW_LNS_negate_stmt +0x000005b5: 01 DW_LNS_copy + 0x000000000000034e 81 11 1 0 0 is_stmt -0x000005b7: 00 DW_LNE_set_address (0x0000000000000351) -0x000005be: 05 DW_LNS_set_column (25) -0x000005c0: 01 DW_LNS_copy - 0x0000000000000351 79 25 1 0 0 +0x000005b6: 00 DW_LNE_set_address (0x0000000000000353) +0x000005bd: 03 DW_LNS_advance_line (66) +0x000005bf: 05 DW_LNS_set_column (16) +0x000005c1: 01 DW_LNS_copy + 0x0000000000000353 66 16 1 0 0 is_stmt -0x000005c1: 00 DW_LNE_set_address (0x0000000000000358) -0x000005c8: 03 DW_LNS_advance_line (81) -0x000005ca: 05 DW_LNS_set_column (11) -0x000005cc: 06 DW_LNS_negate_stmt +0x000005c2: 00 DW_LNE_set_address (0x000000000000035a) +0x000005c9: 03 DW_LNS_advance_line (74) +0x000005cb: 05 DW_LNS_set_column (22) 0x000005cd: 01 DW_LNS_copy - 0x0000000000000358 81 11 1 0 0 is_stmt + 0x000000000000035a 74 22 1 0 0 is_stmt -0x000005ce: 00 DW_LNE_set_address (0x000000000000035d) -0x000005d5: 03 DW_LNS_advance_line (66) -0x000005d7: 05 DW_LNS_set_column (16) +0x000005ce: 00 DW_LNE_set_address (0x0000000000000368) +0x000005d5: 03 DW_LNS_advance_line (67) +0x000005d7: 05 DW_LNS_set_column (13) 0x000005d9: 01 DW_LNS_copy - 0x000000000000035d 66 16 1 0 0 is_stmt + 0x0000000000000368 67 13 1 0 0 is_stmt -0x000005da: 00 DW_LNE_set_address (0x0000000000000364) -0x000005e1: 03 DW_LNS_advance_line (74) -0x000005e3: 05 DW_LNS_set_column (22) -0x000005e5: 01 DW_LNS_copy - 0x0000000000000364 74 22 1 0 0 is_stmt +0x000005da: 00 DW_LNE_set_address (0x000000000000036c) +0x000005e1: 03 DW_LNS_advance_line (68) +0x000005e3: 01 DW_LNS_copy + 0x000000000000036c 68 13 1 0 0 is_stmt -0x000005e6: 00 DW_LNE_set_address (0x0000000000000372) -0x000005ed: 03 DW_LNS_advance_line (67) -0x000005ef: 05 DW_LNS_set_column (13) -0x000005f1: 01 DW_LNS_copy - 0x0000000000000372 67 13 1 0 0 is_stmt +0x000005e4: 00 DW_LNE_set_address (0x0000000000000370) +0x000005eb: 03 DW_LNS_advance_line (69) +0x000005ed: 01 DW_LNS_copy + 0x0000000000000370 69 13 1 0 0 is_stmt -0x000005f2: 00 DW_LNE_set_address (0x0000000000000376) -0x000005f9: 03 DW_LNS_advance_line (68) -0x000005fb: 01 DW_LNS_copy - 0x0000000000000376 68 13 1 0 0 is_stmt +0x000005ee: 00 DW_LNE_set_address (0x0000000000000374) +0x000005f5: 03 DW_LNS_advance_line (70) +0x000005f7: 01 DW_LNS_copy + 0x0000000000000374 70 13 1 0 0 is_stmt -0x000005fc: 00 DW_LNE_set_address (0x000000000000037a) -0x00000603: 03 DW_LNS_advance_line (69) -0x00000605: 01 DW_LNS_copy - 0x000000000000037a 69 13 1 0 0 is_stmt +0x000005f8: 00 DW_LNE_set_address (0x0000000000000377) +0x000005ff: 00 DW_LNE_end_sequence + 0x0000000000000377 70 13 1 0 0 is_stmt end_sequence +0x00000602: 00 DW_LNE_set_address (0x0000000000000379) +0x00000609: 03 DW_LNS_advance_line (152) +0x0000060c: 01 DW_LNS_copy + 0x0000000000000379 152 0 1 0 0 is_stmt -0x00000606: 00 DW_LNE_set_address (0x000000000000037e) -0x0000060d: 03 DW_LNS_advance_line (70) -0x0000060f: 01 DW_LNS_copy - 0x000000000000037e 70 13 1 0 0 is_stmt +0x0000060d: 00 DW_LNE_set_address (0x0000000000000395) +0x00000614: 03 DW_LNS_advance_line (153) +0x00000616: 05 DW_LNS_set_column (17) +0x00000618: 0a DW_LNS_set_prologue_end +0x00000619: 01 DW_LNS_copy + 0x0000000000000395 153 17 1 0 0 is_stmt prologue_end -0x00000610: 00 DW_LNE_set_address (0x0000000000000381) -0x00000617: 00 DW_LNE_end_sequence - 0x0000000000000381 70 13 1 0 0 is_stmt end_sequence -0x0000061a: 00 DW_LNE_set_address (0x0000000000000383) -0x00000621: 03 DW_LNS_advance_line (152) +0x0000061a: 00 DW_LNE_set_address (0x000000000000039c) +0x00000621: 05 DW_LNS_set_column (28) +0x00000623: 06 DW_LNS_negate_stmt 0x00000624: 01 DW_LNS_copy - 0x0000000000000383 152 0 1 0 0 is_stmt + 0x000000000000039c 153 28 1 0 0 -0x00000625: 00 DW_LNE_set_address (0x000000000000039f) -0x0000062c: 03 DW_LNS_advance_line (153) -0x0000062e: 05 DW_LNS_set_column (17) -0x00000630: 0a DW_LNS_set_prologue_end -0x00000631: 01 DW_LNS_copy - 0x000000000000039f 153 17 1 0 0 is_stmt prologue_end +0x00000625: 00 DW_LNE_set_address (0x00000000000003a1) +0x0000062c: 05 DW_LNS_set_column (23) +0x0000062e: 01 DW_LNS_copy + 0x00000000000003a1 153 23 1 0 0 -0x00000632: 00 DW_LNE_set_address (0x00000000000003a6) -0x00000639: 05 DW_LNS_set_column (28) -0x0000063b: 06 DW_LNS_negate_stmt -0x0000063c: 01 DW_LNS_copy - 0x00000000000003a6 153 28 1 0 0 +0x0000062f: 00 DW_LNE_set_address (0x00000000000003a7) +0x00000636: 03 DW_LNS_advance_line (155) +0x00000638: 05 DW_LNS_set_column (10) +0x0000063a: 06 DW_LNS_negate_stmt +0x0000063b: 01 DW_LNS_copy + 0x00000000000003a7 155 10 1 0 0 is_stmt -0x0000063d: 00 DW_LNE_set_address (0x00000000000003ab) -0x00000644: 05 DW_LNS_set_column (23) +0x0000063c: 00 DW_LNE_set_address (0x00000000000003a8) +0x00000643: 05 DW_LNS_set_column (8) +0x00000645: 06 DW_LNS_negate_stmt 0x00000646: 01 DW_LNS_copy - 0x00000000000003ab 153 23 1 0 0 + 0x00000000000003a8 155 8 1 0 0 -0x00000647: 00 DW_LNE_set_address (0x00000000000003b1) -0x0000064e: 03 DW_LNS_advance_line (155) -0x00000650: 05 DW_LNS_set_column (10) +0x00000647: 00 DW_LNE_set_address (0x00000000000003ab) +0x0000064e: 03 DW_LNS_advance_line (156) +0x00000650: 05 DW_LNS_set_column (7) 0x00000652: 06 DW_LNS_negate_stmt 0x00000653: 01 DW_LNS_copy - 0x00000000000003b1 155 10 1 0 0 is_stmt + 0x00000000000003ab 156 7 1 0 0 is_stmt -0x00000654: 00 DW_LNE_set_address (0x00000000000003b2) -0x0000065b: 05 DW_LNS_set_column (8) -0x0000065d: 06 DW_LNS_negate_stmt -0x0000065e: 01 DW_LNS_copy - 0x00000000000003b2 155 8 1 0 0 +0x00000654: 00 DW_LNE_set_address (0x00000000000003b8) +0x0000065b: 03 DW_LNS_advance_line (94) +0x0000065d: 05 DW_LNS_set_column (18) +0x0000065f: 01 DW_LNS_copy + 0x00000000000003b8 94 18 1 0 0 is_stmt -0x0000065f: 00 DW_LNE_set_address (0x00000000000003b5) -0x00000666: 03 DW_LNS_advance_line (156) -0x00000668: 05 DW_LNS_set_column (7) -0x0000066a: 06 DW_LNS_negate_stmt +0x00000660: 00 DW_LNE_set_address (0x00000000000003d2) +0x00000667: 03 DW_LNS_advance_line (95) +0x00000669: 05 DW_LNS_set_column (29) 0x0000066b: 01 DW_LNS_copy - 0x00000000000003b5 156 7 1 0 0 is_stmt + 0x00000000000003d2 95 29 1 0 0 is_stmt -0x0000066c: 00 DW_LNE_set_address (0x00000000000003c2) -0x00000673: 03 DW_LNS_advance_line (94) -0x00000675: 05 DW_LNS_set_column (18) +0x0000066c: 00 DW_LNE_set_address (0x00000000000003d4) +0x00000673: 03 DW_LNS_advance_line (98) +0x00000675: 05 DW_LNS_set_column (19) 0x00000677: 01 DW_LNS_copy - 0x00000000000003c2 94 18 1 0 0 is_stmt + 0x00000000000003d4 98 19 1 0 0 is_stmt -0x00000678: 00 DW_LNE_set_address (0x00000000000003dc) -0x0000067f: 03 DW_LNS_advance_line (95) -0x00000681: 05 DW_LNS_set_column (29) +0x00000678: 00 DW_LNE_set_address (0x00000000000003db) +0x0000067f: 03 DW_LNS_advance_line (97) +0x00000681: 05 DW_LNS_set_column (16) 0x00000683: 01 DW_LNS_copy - 0x00000000000003dc 95 29 1 0 0 is_stmt + 0x00000000000003db 97 16 1 0 0 is_stmt -0x00000684: 00 DW_LNE_set_address (0x00000000000003de) -0x0000068b: 03 DW_LNS_advance_line (98) -0x0000068d: 05 DW_LNS_set_column (19) -0x0000068f: 01 DW_LNS_copy - 0x00000000000003de 98 19 1 0 0 is_stmt +0x00000684: 00 DW_LNE_set_address (0x00000000000003e2) +0x0000068b: 03 DW_LNS_advance_line (96) +0x0000068d: 01 DW_LNS_copy + 0x00000000000003e2 96 16 1 0 0 is_stmt -0x00000690: 00 DW_LNE_set_address (0x00000000000003e5) -0x00000697: 03 DW_LNS_advance_line (97) -0x00000699: 05 DW_LNS_set_column (16) -0x0000069b: 01 DW_LNS_copy - 0x00000000000003e5 97 16 1 0 0 is_stmt +0x0000068e: 00 DW_LNE_set_address (0x00000000000003ed) +0x00000695: 03 DW_LNS_advance_line (94) +0x00000697: 05 DW_LNS_set_column (28) +0x00000699: 01 DW_LNS_copy + 0x00000000000003ed 94 28 1 0 0 is_stmt -0x0000069c: 00 DW_LNE_set_address (0x00000000000003ec) -0x000006a3: 03 DW_LNS_advance_line (96) -0x000006a5: 01 DW_LNS_copy - 0x00000000000003ec 96 16 1 0 0 is_stmt +0x0000069a: 00 DW_LNE_set_address (0x00000000000003f2) +0x000006a1: 05 DW_LNS_set_column (18) +0x000006a3: 06 DW_LNS_negate_stmt +0x000006a4: 01 DW_LNS_copy + 0x00000000000003f2 94 18 1 0 0 -0x000006a6: 00 DW_LNE_set_address (0x00000000000003f7) -0x000006ad: 03 DW_LNS_advance_line (94) -0x000006af: 05 DW_LNS_set_column (28) -0x000006b1: 01 DW_LNS_copy - 0x00000000000003f7 94 28 1 0 0 is_stmt +0x000006a5: 00 DW_LNE_set_address (0x00000000000003f7) +0x000006ac: 05 DW_LNS_set_column (4) +0x000006ae: 01 DW_LNS_copy + 0x00000000000003f7 94 4 1 0 0 -0x000006b2: 00 DW_LNE_set_address (0x00000000000003fc) -0x000006b9: 05 DW_LNS_set_column (18) -0x000006bb: 06 DW_LNS_negate_stmt -0x000006bc: 01 DW_LNS_copy - 0x00000000000003fc 94 18 1 0 0 +0x000006af: 00 DW_LNE_set_address (0x00000000000003ff) +0x000006b6: 03 DW_LNS_advance_line (102) +0x000006b8: 05 DW_LNS_set_column (27) +0x000006ba: 06 DW_LNS_negate_stmt +0x000006bb: 01 DW_LNS_copy + 0x00000000000003ff 102 27 1 0 0 is_stmt -0x000006bd: 00 DW_LNE_set_address (0x0000000000000401) -0x000006c4: 05 DW_LNS_set_column (4) +0x000006bc: 00 DW_LNE_set_address (0x0000000000000404) +0x000006c3: 05 DW_LNS_set_column (18) +0x000006c5: 06 DW_LNS_negate_stmt 0x000006c6: 01 DW_LNS_copy - 0x0000000000000401 94 4 1 0 0 + 0x0000000000000404 102 18 1 0 0 -0x000006c7: 00 DW_LNE_set_address (0x0000000000000409) -0x000006ce: 03 DW_LNS_advance_line (102) -0x000006d0: 05 DW_LNS_set_column (27) -0x000006d2: 06 DW_LNS_negate_stmt -0x000006d3: 01 DW_LNS_copy - 0x0000000000000409 102 27 1 0 0 is_stmt +0x000006c7: 00 DW_LNE_set_address (0x000000000000040a) +0x000006ce: 03 DW_LNS_advance_line (103) +0x000006d0: 06 DW_LNS_negate_stmt +0x000006d1: 01 DW_LNS_copy + 0x000000000000040a 103 18 1 0 0 is_stmt -0x000006d4: 00 DW_LNE_set_address (0x000000000000040e) -0x000006db: 05 DW_LNS_set_column (18) -0x000006dd: 06 DW_LNS_negate_stmt -0x000006de: 01 DW_LNS_copy - 0x000000000000040e 102 18 1 0 0 +0x000006d2: 00 DW_LNE_set_address (0x0000000000000416) +0x000006d9: 03 DW_LNS_advance_line (105) +0x000006db: 01 DW_LNS_copy + 0x0000000000000416 105 18 1 0 0 is_stmt -0x000006df: 00 DW_LNE_set_address (0x0000000000000414) -0x000006e6: 03 DW_LNS_advance_line (103) -0x000006e8: 06 DW_LNS_negate_stmt -0x000006e9: 01 DW_LNS_copy - 0x0000000000000414 103 18 1 0 0 is_stmt +0x000006dc: 00 DW_LNE_set_address (0x000000000000041f) +0x000006e3: 03 DW_LNS_advance_line (106) +0x000006e5: 05 DW_LNS_set_column (7) +0x000006e7: 01 DW_LNS_copy + 0x000000000000041f 106 7 1 0 0 is_stmt -0x000006ea: 00 DW_LNE_set_address (0x0000000000000420) -0x000006f1: 03 DW_LNS_advance_line (105) -0x000006f3: 01 DW_LNS_copy - 0x0000000000000420 105 18 1 0 0 is_stmt +0x000006e8: 00 DW_LNE_set_address (0x0000000000000427) +0x000006ef: 05 DW_LNS_set_column (16) +0x000006f1: 06 DW_LNS_negate_stmt +0x000006f2: 01 DW_LNS_copy + 0x0000000000000427 106 16 1 0 0 -0x000006f4: 00 DW_LNE_set_address (0x0000000000000429) -0x000006fb: 03 DW_LNS_advance_line (106) -0x000006fd: 05 DW_LNS_set_column (7) +0x000006f3: 00 DW_LNE_set_address (0x000000000000042c) +0x000006fa: 03 DW_LNS_advance_line (105) +0x000006fc: 05 DW_LNS_set_column (24) +0x000006fe: 06 DW_LNS_negate_stmt 0x000006ff: 01 DW_LNS_copy - 0x0000000000000429 106 7 1 0 0 is_stmt + 0x000000000000042c 105 24 1 0 0 is_stmt 0x00000700: 00 DW_LNE_set_address (0x0000000000000431) -0x00000707: 05 DW_LNS_set_column (16) +0x00000707: 05 DW_LNS_set_column (18) 0x00000709: 06 DW_LNS_negate_stmt 0x0000070a: 01 DW_LNS_copy - 0x0000000000000431 106 16 1 0 0 + 0x0000000000000431 105 18 1 0 0 -0x0000070b: 00 DW_LNE_set_address (0x0000000000000436) -0x00000712: 03 DW_LNS_advance_line (105) -0x00000714: 05 DW_LNS_set_column (24) +0x0000070b: 00 DW_LNE_set_address (0x0000000000000457) +0x00000712: 03 DW_LNS_advance_line (112) +0x00000714: 05 DW_LNS_set_column (13) 0x00000716: 06 DW_LNS_negate_stmt 0x00000717: 01 DW_LNS_copy - 0x0000000000000436 105 24 1 0 0 is_stmt + 0x0000000000000457 112 13 1 0 0 is_stmt -0x00000718: 00 DW_LNE_set_address (0x000000000000043b) -0x0000071f: 05 DW_LNS_set_column (18) +0x00000718: 00 DW_LNE_set_address (0x0000000000000459) +0x0000071f: 05 DW_LNS_set_column (26) 0x00000721: 06 DW_LNS_negate_stmt 0x00000722: 01 DW_LNS_copy - 0x000000000000043b 105 18 1 0 0 + 0x0000000000000459 112 26 1 0 0 -0x00000723: 00 DW_LNE_set_address (0x0000000000000461) -0x0000072a: 03 DW_LNS_advance_line (112) -0x0000072c: 05 DW_LNS_set_column (13) -0x0000072e: 06 DW_LNS_negate_stmt -0x0000072f: 01 DW_LNS_copy - 0x0000000000000461 112 13 1 0 0 is_stmt +0x00000723: 00 DW_LNE_set_address (0x0000000000000466) +0x0000072a: 05 DW_LNS_set_column (35) +0x0000072c: 01 DW_LNS_copy + 0x0000000000000466 112 35 1 0 0 -0x00000730: 00 DW_LNE_set_address (0x0000000000000463) -0x00000737: 05 DW_LNS_set_column (26) -0x00000739: 06 DW_LNS_negate_stmt -0x0000073a: 01 DW_LNS_copy - 0x0000000000000463 112 26 1 0 0 +0x0000072d: 00 DW_LNE_set_address (0x0000000000000467) +0x00000734: 05 DW_LNS_set_column (13) +0x00000736: 01 DW_LNS_copy + 0x0000000000000467 112 13 1 0 0 -0x0000073b: 00 DW_LNE_set_address (0x0000000000000470) -0x00000742: 05 DW_LNS_set_column (35) -0x00000744: 01 DW_LNS_copy - 0x0000000000000470 112 35 1 0 0 +0x00000737: 00 DW_LNE_set_address (0x0000000000000475) +0x0000073e: 03 DW_LNS_advance_line (111) +0x00000740: 05 DW_LNS_set_column (30) +0x00000742: 06 DW_LNS_negate_stmt +0x00000743: 01 DW_LNS_copy + 0x0000000000000475 111 30 1 0 0 is_stmt -0x00000745: 00 DW_LNE_set_address (0x0000000000000471) -0x0000074c: 05 DW_LNS_set_column (13) +0x00000744: 00 DW_LNE_set_address (0x000000000000047a) +0x0000074b: 05 DW_LNS_set_column (24) +0x0000074d: 06 DW_LNS_negate_stmt 0x0000074e: 01 DW_LNS_copy - 0x0000000000000471 112 13 1 0 0 + 0x000000000000047a 111 24 1 0 0 0x0000074f: 00 DW_LNE_set_address (0x000000000000047f) -0x00000756: 03 DW_LNS_advance_line (111) -0x00000758: 05 DW_LNS_set_column (30) -0x0000075a: 06 DW_LNS_negate_stmt -0x0000075b: 01 DW_LNS_copy - 0x000000000000047f 111 30 1 0 0 is_stmt +0x00000756: 05 DW_LNS_set_column (10) +0x00000758: 01 DW_LNS_copy + 0x000000000000047f 111 10 1 0 0 -0x0000075c: 00 DW_LNE_set_address (0x0000000000000484) -0x00000763: 05 DW_LNS_set_column (24) -0x00000765: 06 DW_LNS_negate_stmt -0x00000766: 01 DW_LNS_copy - 0x0000000000000484 111 24 1 0 0 +0x00000759: 00 DW_LNE_set_address (0x0000000000000484) +0x00000760: 03 DW_LNS_advance_line (113) +0x00000762: 06 DW_LNS_negate_stmt +0x00000763: 01 DW_LNS_copy + 0x0000000000000484 113 10 1 0 0 is_stmt -0x00000767: 00 DW_LNE_set_address (0x0000000000000489) -0x0000076e: 05 DW_LNS_set_column (10) -0x00000770: 01 DW_LNS_copy - 0x0000000000000489 111 10 1 0 0 +0x00000764: 00 DW_LNE_set_address (0x0000000000000487) +0x0000076b: 03 DW_LNS_advance_line (118) +0x0000076d: 05 DW_LNS_set_column (16) +0x0000076f: 01 DW_LNS_copy + 0x0000000000000487 118 16 1 0 0 is_stmt -0x00000771: 00 DW_LNE_set_address (0x000000000000048e) -0x00000778: 03 DW_LNS_advance_line (113) -0x0000077a: 06 DW_LNS_negate_stmt +0x00000770: 00 DW_LNE_set_address (0x0000000000000490) +0x00000777: 03 DW_LNS_advance_line (119) +0x00000779: 05 DW_LNS_set_column (10) 0x0000077b: 01 DW_LNS_copy - 0x000000000000048e 113 10 1 0 0 is_stmt + 0x0000000000000490 119 10 1 0 0 is_stmt -0x0000077c: 00 DW_LNE_set_address (0x0000000000000491) -0x00000783: 03 DW_LNS_advance_line (118) -0x00000785: 05 DW_LNS_set_column (16) -0x00000787: 01 DW_LNS_copy - 0x0000000000000491 118 16 1 0 0 is_stmt +0x0000077c: 00 DW_LNE_set_address (0x0000000000000492) +0x00000783: 05 DW_LNS_set_column (18) +0x00000785: 06 DW_LNS_negate_stmt +0x00000786: 01 DW_LNS_copy + 0x0000000000000492 119 18 1 0 0 -0x00000788: 00 DW_LNE_set_address (0x000000000000049a) -0x0000078f: 03 DW_LNS_advance_line (119) -0x00000791: 05 DW_LNS_set_column (10) -0x00000793: 01 DW_LNS_copy - 0x000000000000049a 119 10 1 0 0 is_stmt +0x00000787: 00 DW_LNE_set_address (0x000000000000049b) +0x0000078e: 05 DW_LNS_set_column (10) +0x00000790: 01 DW_LNS_copy + 0x000000000000049b 119 10 1 0 0 -0x00000794: 00 DW_LNE_set_address (0x000000000000049c) -0x0000079b: 05 DW_LNS_set_column (18) -0x0000079d: 06 DW_LNS_negate_stmt -0x0000079e: 01 DW_LNS_copy - 0x000000000000049c 119 18 1 0 0 +0x00000791: 00 DW_LNE_set_address (0x000000000000049d) +0x00000798: 05 DW_LNS_set_column (23) +0x0000079a: 01 DW_LNS_copy + 0x000000000000049d 119 23 1 0 0 -0x0000079f: 00 DW_LNE_set_address (0x00000000000004a5) -0x000007a6: 05 DW_LNS_set_column (10) -0x000007a8: 01 DW_LNS_copy - 0x00000000000004a5 119 10 1 0 0 +0x0000079b: 00 DW_LNE_set_address (0x00000000000004a2) +0x000007a2: 03 DW_LNS_advance_line (118) +0x000007a4: 05 DW_LNS_set_column (16) +0x000007a6: 06 DW_LNS_negate_stmt +0x000007a7: 01 DW_LNS_copy + 0x00000000000004a2 118 16 1 0 0 is_stmt -0x000007a9: 00 DW_LNE_set_address (0x00000000000004a7) -0x000007b0: 05 DW_LNS_set_column (23) -0x000007b2: 01 DW_LNS_copy - 0x00000000000004a7 119 23 1 0 0 +0x000007a8: 00 DW_LNE_set_address (0x00000000000004af) +0x000007af: 03 DW_LNS_advance_line (122) +0x000007b1: 01 DW_LNS_copy + 0x00000000000004af 122 16 1 0 0 is_stmt -0x000007b3: 00 DW_LNE_set_address (0x00000000000004ac) -0x000007ba: 03 DW_LNS_advance_line (118) -0x000007bc: 05 DW_LNS_set_column (16) -0x000007be: 06 DW_LNS_negate_stmt -0x000007bf: 01 DW_LNS_copy - 0x00000000000004ac 118 16 1 0 0 is_stmt +0x000007b2: 00 DW_LNE_set_address (0x00000000000004c3) +0x000007b9: 03 DW_LNS_advance_line (125) +0x000007bb: 05 DW_LNS_set_column (22) +0x000007bd: 01 DW_LNS_copy + 0x00000000000004c3 125 22 1 0 0 is_stmt -0x000007c0: 00 DW_LNE_set_address (0x00000000000004b9) -0x000007c7: 03 DW_LNS_advance_line (122) +0x000007be: 00 DW_LNE_set_address (0x00000000000004ca) +0x000007c5: 03 DW_LNS_advance_line (126) +0x000007c7: 05 DW_LNS_set_column (27) 0x000007c9: 01 DW_LNS_copy - 0x00000000000004b9 122 16 1 0 0 is_stmt + 0x00000000000004ca 126 27 1 0 0 is_stmt -0x000007ca: 00 DW_LNE_set_address (0x00000000000004cd) -0x000007d1: 03 DW_LNS_advance_line (125) -0x000007d3: 05 DW_LNS_set_column (22) +0x000007ca: 00 DW_LNE_set_address (0x00000000000004d3) +0x000007d1: 03 DW_LNS_advance_line (127) +0x000007d3: 05 DW_LNS_set_column (16) 0x000007d5: 01 DW_LNS_copy - 0x00000000000004cd 125 22 1 0 0 is_stmt + 0x00000000000004d3 127 16 1 0 0 is_stmt -0x000007d6: 00 DW_LNE_set_address (0x00000000000004d4) -0x000007dd: 03 DW_LNS_advance_line (126) -0x000007df: 05 DW_LNS_set_column (27) -0x000007e1: 01 DW_LNS_copy - 0x00000000000004d4 126 27 1 0 0 is_stmt +0x000007d6: 00 DW_LNE_set_address (0x00000000000004db) +0x000007dd: 05 DW_LNS_set_column (27) +0x000007df: 06 DW_LNS_negate_stmt +0x000007e0: 01 DW_LNS_copy + 0x00000000000004db 127 27 1 0 0 -0x000007e2: 00 DW_LNE_set_address (0x00000000000004dd) -0x000007e9: 03 DW_LNS_advance_line (127) -0x000007eb: 05 DW_LNS_set_column (16) -0x000007ed: 01 DW_LNS_copy - 0x00000000000004dd 127 16 1 0 0 is_stmt +0x000007e1: 00 DW_LNE_set_address (0x00000000000004dd) +0x000007e8: 05 DW_LNS_set_column (35) +0x000007ea: 01 DW_LNS_copy + 0x00000000000004dd 127 35 1 0 0 -0x000007ee: 00 DW_LNE_set_address (0x00000000000004e5) -0x000007f5: 05 DW_LNS_set_column (27) -0x000007f7: 06 DW_LNS_negate_stmt -0x000007f8: 01 DW_LNS_copy - 0x00000000000004e5 127 27 1 0 0 +0x000007eb: 00 DW_LNE_set_address (0x00000000000004e6) +0x000007f2: 05 DW_LNS_set_column (27) +0x000007f4: 01 DW_LNS_copy + 0x00000000000004e6 127 27 1 0 0 -0x000007f9: 00 DW_LNE_set_address (0x00000000000004e7) -0x00000800: 05 DW_LNS_set_column (35) -0x00000802: 01 DW_LNS_copy - 0x00000000000004e7 127 35 1 0 0 +0x000007f5: 00 DW_LNE_set_address (0x00000000000004eb) +0x000007fc: 05 DW_LNS_set_column (25) +0x000007fe: 01 DW_LNS_copy + 0x00000000000004eb 127 25 1 0 0 -0x00000803: 00 DW_LNE_set_address (0x00000000000004f0) -0x0000080a: 05 DW_LNS_set_column (27) -0x0000080c: 01 DW_LNS_copy - 0x00000000000004f0 127 27 1 0 0 +0x000007ff: 00 DW_LNE_set_address (0x00000000000004ee) +0x00000806: 03 DW_LNS_advance_line (126) +0x00000808: 05 DW_LNS_set_column (27) +0x0000080a: 06 DW_LNS_negate_stmt +0x0000080b: 01 DW_LNS_copy + 0x00000000000004ee 126 27 1 0 0 is_stmt -0x0000080d: 00 DW_LNE_set_address (0x00000000000004f5) -0x00000814: 05 DW_LNS_set_column (25) +0x0000080c: 00 DW_LNE_set_address (0x00000000000004f3) +0x00000813: 05 DW_LNS_set_column (13) +0x00000815: 06 DW_LNS_negate_stmt 0x00000816: 01 DW_LNS_copy - 0x00000000000004f5 127 25 1 0 0 + 0x00000000000004f3 126 13 1 0 0 -0x00000817: 00 DW_LNE_set_address (0x00000000000004f8) -0x0000081e: 03 DW_LNS_advance_line (126) -0x00000820: 05 DW_LNS_set_column (27) -0x00000822: 06 DW_LNS_negate_stmt -0x00000823: 01 DW_LNS_copy - 0x00000000000004f8 126 27 1 0 0 is_stmt +0x00000817: 00 DW_LNE_set_address (0x00000000000004fb) +0x0000081e: 03 DW_LNS_advance_line (128) +0x00000820: 06 DW_LNS_negate_stmt +0x00000821: 01 DW_LNS_copy + 0x00000000000004fb 128 13 1 0 0 is_stmt -0x00000824: 00 DW_LNE_set_address (0x00000000000004fd) -0x0000082b: 05 DW_LNS_set_column (13) -0x0000082d: 06 DW_LNS_negate_stmt -0x0000082e: 01 DW_LNS_copy - 0x00000000000004fd 126 13 1 0 0 +0x00000822: 00 DW_LNE_set_address (0x0000000000000503) +0x00000829: 05 DW_LNS_set_column (22) +0x0000082b: 06 DW_LNS_negate_stmt +0x0000082c: 01 DW_LNS_copy + 0x0000000000000503 128 22 1 0 0 -0x0000082f: 00 DW_LNE_set_address (0x0000000000000505) -0x00000836: 03 DW_LNS_advance_line (128) +0x0000082d: 00 DW_LNE_set_address (0x0000000000000508) +0x00000834: 03 DW_LNS_advance_line (130) +0x00000836: 05 DW_LNS_set_column (16) 0x00000838: 06 DW_LNS_negate_stmt 0x00000839: 01 DW_LNS_copy - 0x0000000000000505 128 13 1 0 0 is_stmt + 0x0000000000000508 130 16 1 0 0 is_stmt -0x0000083a: 00 DW_LNE_set_address (0x000000000000050d) -0x00000841: 05 DW_LNS_set_column (22) +0x0000083a: 00 DW_LNE_set_address (0x0000000000000510) +0x00000841: 05 DW_LNS_set_column (14) 0x00000843: 06 DW_LNS_negate_stmt 0x00000844: 01 DW_LNS_copy - 0x000000000000050d 128 22 1 0 0 + 0x0000000000000510 130 14 1 0 0 -0x00000845: 00 DW_LNE_set_address (0x0000000000000512) -0x0000084c: 03 DW_LNS_advance_line (130) -0x0000084e: 05 DW_LNS_set_column (16) -0x00000850: 06 DW_LNS_negate_stmt -0x00000851: 01 DW_LNS_copy - 0x0000000000000512 130 16 1 0 0 is_stmt +0x00000845: 00 DW_LNE_set_address (0x000000000000051f) +0x0000084c: 05 DW_LNS_set_column (25) +0x0000084e: 01 DW_LNS_copy + 0x000000000000051f 130 25 1 0 0 -0x00000852: 00 DW_LNE_set_address (0x000000000000051a) -0x00000859: 05 DW_LNS_set_column (14) -0x0000085b: 06 DW_LNS_negate_stmt -0x0000085c: 01 DW_LNS_copy - 0x000000000000051a 130 14 1 0 0 +0x0000084f: 00 DW_LNE_set_address (0x0000000000000526) +0x00000856: 03 DW_LNS_advance_line (133) +0x00000858: 05 DW_LNS_set_column (11) +0x0000085a: 06 DW_LNS_negate_stmt +0x0000085b: 01 DW_LNS_copy + 0x0000000000000526 133 11 1 0 0 is_stmt -0x0000085d: 00 DW_LNE_set_address (0x0000000000000529) -0x00000864: 05 DW_LNS_set_column (25) -0x00000866: 01 DW_LNS_copy - 0x0000000000000529 130 25 1 0 0 +0x0000085c: 00 DW_LNE_set_address (0x000000000000052b) +0x00000863: 03 DW_LNS_advance_line (122) +0x00000865: 05 DW_LNS_set_column (16) +0x00000867: 01 DW_LNS_copy + 0x000000000000052b 122 16 1 0 0 is_stmt -0x00000867: 00 DW_LNE_set_address (0x0000000000000530) -0x0000086e: 03 DW_LNS_advance_line (133) -0x00000870: 05 DW_LNS_set_column (11) -0x00000872: 06 DW_LNS_negate_stmt -0x00000873: 01 DW_LNS_copy - 0x0000000000000530 133 11 1 0 0 is_stmt +0x00000868: 00 DW_LNE_set_address (0x0000000000000530) +0x0000086f: 05 DW_LNS_set_column (14) +0x00000871: 06 DW_LNS_negate_stmt +0x00000872: 01 DW_LNS_copy + 0x0000000000000530 122 14 1 0 0 -0x00000874: 00 DW_LNE_set_address (0x0000000000000535) -0x0000087b: 03 DW_LNS_advance_line (122) -0x0000087d: 05 DW_LNS_set_column (16) +0x00000873: 00 DW_LNE_set_address (0x0000000000000536) +0x0000087a: 03 DW_LNS_advance_line (110) +0x0000087c: 05 DW_LNS_set_column (11) +0x0000087e: 06 DW_LNS_negate_stmt 0x0000087f: 01 DW_LNS_copy - 0x0000000000000535 122 16 1 0 0 is_stmt + 0x0000000000000536 110 11 1 0 0 is_stmt -0x00000880: 00 DW_LNE_set_address (0x000000000000053a) -0x00000887: 05 DW_LNS_set_column (14) -0x00000889: 06 DW_LNS_negate_stmt -0x0000088a: 01 DW_LNS_copy - 0x000000000000053a 122 14 1 0 0 +0x00000880: 00 DW_LNE_set_address (0x0000000000000542) +0x00000887: 03 DW_LNS_advance_line (113) +0x00000889: 05 DW_LNS_set_column (10) +0x0000088b: 01 DW_LNS_copy + 0x0000000000000542 113 10 1 0 0 is_stmt -0x0000088b: 00 DW_LNE_set_address (0x0000000000000540) -0x00000892: 03 DW_LNS_advance_line (110) -0x00000894: 05 DW_LNS_set_column (11) -0x00000896: 06 DW_LNS_negate_stmt +0x0000088c: 00 DW_LNE_set_address (0x0000000000000545) +0x00000893: 03 DW_LNS_advance_line (118) +0x00000895: 05 DW_LNS_set_column (16) 0x00000897: 01 DW_LNS_copy - 0x0000000000000540 110 11 1 0 0 is_stmt + 0x0000000000000545 118 16 1 0 0 is_stmt -0x00000898: 00 DW_LNE_set_address (0x000000000000054c) -0x0000089f: 03 DW_LNS_advance_line (113) +0x00000898: 00 DW_LNE_set_address (0x000000000000054e) +0x0000089f: 03 DW_LNS_advance_line (119) 0x000008a1: 05 DW_LNS_set_column (10) 0x000008a3: 01 DW_LNS_copy - 0x000000000000054c 113 10 1 0 0 is_stmt + 0x000000000000054e 119 10 1 0 0 is_stmt -0x000008a4: 00 DW_LNE_set_address (0x000000000000054f) -0x000008ab: 03 DW_LNS_advance_line (118) -0x000008ad: 05 DW_LNS_set_column (16) -0x000008af: 01 DW_LNS_copy - 0x000000000000054f 118 16 1 0 0 is_stmt +0x000008a4: 00 DW_LNE_set_address (0x0000000000000550) +0x000008ab: 05 DW_LNS_set_column (18) +0x000008ad: 06 DW_LNS_negate_stmt +0x000008ae: 01 DW_LNS_copy + 0x0000000000000550 119 18 1 0 0 -0x000008b0: 00 DW_LNE_set_address (0x0000000000000558) -0x000008b7: 03 DW_LNS_advance_line (119) -0x000008b9: 05 DW_LNS_set_column (10) -0x000008bb: 01 DW_LNS_copy - 0x0000000000000558 119 10 1 0 0 is_stmt +0x000008af: 00 DW_LNE_set_address (0x0000000000000559) +0x000008b6: 05 DW_LNS_set_column (10) +0x000008b8: 01 DW_LNS_copy + 0x0000000000000559 119 10 1 0 0 -0x000008bc: 00 DW_LNE_set_address (0x000000000000055a) -0x000008c3: 05 DW_LNS_set_column (18) -0x000008c5: 06 DW_LNS_negate_stmt -0x000008c6: 01 DW_LNS_copy - 0x000000000000055a 119 18 1 0 0 +0x000008b9: 00 DW_LNE_set_address (0x000000000000055b) +0x000008c0: 05 DW_LNS_set_column (23) +0x000008c2: 01 DW_LNS_copy + 0x000000000000055b 119 23 1 0 0 -0x000008c7: 00 DW_LNE_set_address (0x0000000000000563) -0x000008ce: 05 DW_LNS_set_column (10) -0x000008d0: 01 DW_LNS_copy - 0x0000000000000563 119 10 1 0 0 +0x000008c3: 00 DW_LNE_set_address (0x0000000000000560) +0x000008ca: 03 DW_LNS_advance_line (118) +0x000008cc: 05 DW_LNS_set_column (16) +0x000008ce: 06 DW_LNS_negate_stmt +0x000008cf: 01 DW_LNS_copy + 0x0000000000000560 118 16 1 0 0 is_stmt -0x000008d1: 00 DW_LNE_set_address (0x0000000000000565) -0x000008d8: 05 DW_LNS_set_column (23) -0x000008da: 01 DW_LNS_copy - 0x0000000000000565 119 23 1 0 0 +0x000008d0: 00 DW_LNE_set_address (0x000000000000056d) +0x000008d7: 03 DW_LNS_advance_line (122) +0x000008d9: 01 DW_LNS_copy + 0x000000000000056d 122 16 1 0 0 is_stmt -0x000008db: 00 DW_LNE_set_address (0x000000000000056a) -0x000008e2: 03 DW_LNS_advance_line (118) -0x000008e4: 05 DW_LNS_set_column (16) -0x000008e6: 06 DW_LNS_negate_stmt -0x000008e7: 01 DW_LNS_copy - 0x000000000000056a 118 16 1 0 0 is_stmt +0x000008da: 00 DW_LNE_set_address (0x0000000000000572) +0x000008e1: 05 DW_LNS_set_column (14) +0x000008e3: 06 DW_LNS_negate_stmt +0x000008e4: 01 DW_LNS_copy + 0x0000000000000572 122 14 1 0 0 -0x000008e8: 00 DW_LNE_set_address (0x0000000000000577) -0x000008ef: 03 DW_LNS_advance_line (122) +0x000008e5: 00 DW_LNE_set_address (0x000000000000057b) +0x000008ec: 03 DW_LNS_advance_line (125) +0x000008ee: 05 DW_LNS_set_column (22) +0x000008f0: 06 DW_LNS_negate_stmt 0x000008f1: 01 DW_LNS_copy - 0x0000000000000577 122 16 1 0 0 is_stmt + 0x000000000000057b 125 22 1 0 0 is_stmt -0x000008f2: 00 DW_LNE_set_address (0x000000000000057c) -0x000008f9: 05 DW_LNS_set_column (14) -0x000008fb: 06 DW_LNS_negate_stmt -0x000008fc: 01 DW_LNS_copy - 0x000000000000057c 122 14 1 0 0 +0x000008f2: 00 DW_LNE_set_address (0x0000000000000588) +0x000008f9: 03 DW_LNS_advance_line (126) +0x000008fb: 05 DW_LNS_set_column (27) +0x000008fd: 01 DW_LNS_copy + 0x0000000000000588 126 27 1 0 0 is_stmt -0x000008fd: 00 DW_LNE_set_address (0x0000000000000585) -0x00000904: 03 DW_LNS_advance_line (125) -0x00000906: 05 DW_LNS_set_column (22) -0x00000908: 06 DW_LNS_negate_stmt +0x000008fe: 00 DW_LNE_set_address (0x0000000000000591) +0x00000905: 03 DW_LNS_advance_line (127) +0x00000907: 05 DW_LNS_set_column (16) 0x00000909: 01 DW_LNS_copy - 0x0000000000000585 125 22 1 0 0 is_stmt + 0x0000000000000591 127 16 1 0 0 is_stmt -0x0000090a: 00 DW_LNE_set_address (0x0000000000000592) -0x00000911: 03 DW_LNS_advance_line (126) -0x00000913: 05 DW_LNS_set_column (27) -0x00000915: 01 DW_LNS_copy - 0x0000000000000592 126 27 1 0 0 is_stmt +0x0000090a: 00 DW_LNE_set_address (0x0000000000000599) +0x00000911: 05 DW_LNS_set_column (27) +0x00000913: 06 DW_LNS_negate_stmt +0x00000914: 01 DW_LNS_copy + 0x0000000000000599 127 27 1 0 0 -0x00000916: 00 DW_LNE_set_address (0x000000000000059b) -0x0000091d: 03 DW_LNS_advance_line (127) -0x0000091f: 05 DW_LNS_set_column (16) -0x00000921: 01 DW_LNS_copy - 0x000000000000059b 127 16 1 0 0 is_stmt +0x00000915: 00 DW_LNE_set_address (0x000000000000059b) +0x0000091c: 05 DW_LNS_set_column (35) +0x0000091e: 01 DW_LNS_copy + 0x000000000000059b 127 35 1 0 0 -0x00000922: 00 DW_LNE_set_address (0x00000000000005a3) -0x00000929: 05 DW_LNS_set_column (27) -0x0000092b: 06 DW_LNS_negate_stmt -0x0000092c: 01 DW_LNS_copy - 0x00000000000005a3 127 27 1 0 0 +0x0000091f: 00 DW_LNE_set_address (0x00000000000005a4) +0x00000926: 05 DW_LNS_set_column (27) +0x00000928: 01 DW_LNS_copy + 0x00000000000005a4 127 27 1 0 0 -0x0000092d: 00 DW_LNE_set_address (0x00000000000005a5) -0x00000934: 05 DW_LNS_set_column (35) -0x00000936: 01 DW_LNS_copy - 0x00000000000005a5 127 35 1 0 0 +0x00000929: 00 DW_LNE_set_address (0x00000000000005a9) +0x00000930: 05 DW_LNS_set_column (25) +0x00000932: 01 DW_LNS_copy + 0x00000000000005a9 127 25 1 0 0 -0x00000937: 00 DW_LNE_set_address (0x00000000000005ae) -0x0000093e: 05 DW_LNS_set_column (27) -0x00000940: 01 DW_LNS_copy - 0x00000000000005ae 127 27 1 0 0 +0x00000933: 00 DW_LNE_set_address (0x00000000000005ac) +0x0000093a: 03 DW_LNS_advance_line (126) +0x0000093c: 05 DW_LNS_set_column (27) +0x0000093e: 06 DW_LNS_negate_stmt +0x0000093f: 01 DW_LNS_copy + 0x00000000000005ac 126 27 1 0 0 is_stmt -0x00000941: 00 DW_LNE_set_address (0x00000000000005b3) -0x00000948: 05 DW_LNS_set_column (25) +0x00000940: 00 DW_LNE_set_address (0x00000000000005b1) +0x00000947: 05 DW_LNS_set_column (13) +0x00000949: 06 DW_LNS_negate_stmt 0x0000094a: 01 DW_LNS_copy - 0x00000000000005b3 127 25 1 0 0 + 0x00000000000005b1 126 13 1 0 0 -0x0000094b: 00 DW_LNE_set_address (0x00000000000005b6) -0x00000952: 03 DW_LNS_advance_line (126) -0x00000954: 05 DW_LNS_set_column (27) -0x00000956: 06 DW_LNS_negate_stmt -0x00000957: 01 DW_LNS_copy - 0x00000000000005b6 126 27 1 0 0 is_stmt +0x0000094b: 00 DW_LNE_set_address (0x00000000000005b9) +0x00000952: 03 DW_LNS_advance_line (128) +0x00000954: 06 DW_LNS_negate_stmt +0x00000955: 01 DW_LNS_copy + 0x00000000000005b9 128 13 1 0 0 is_stmt -0x00000958: 00 DW_LNE_set_address (0x00000000000005bb) -0x0000095f: 05 DW_LNS_set_column (13) -0x00000961: 06 DW_LNS_negate_stmt -0x00000962: 01 DW_LNS_copy - 0x00000000000005bb 126 13 1 0 0 +0x00000956: 00 DW_LNE_set_address (0x00000000000005c1) +0x0000095d: 05 DW_LNS_set_column (22) +0x0000095f: 06 DW_LNS_negate_stmt +0x00000960: 01 DW_LNS_copy + 0x00000000000005c1 128 22 1 0 0 -0x00000963: 00 DW_LNE_set_address (0x00000000000005c3) -0x0000096a: 03 DW_LNS_advance_line (128) +0x00000961: 00 DW_LNE_set_address (0x00000000000005c6) +0x00000968: 03 DW_LNS_advance_line (130) +0x0000096a: 05 DW_LNS_set_column (16) 0x0000096c: 06 DW_LNS_negate_stmt 0x0000096d: 01 DW_LNS_copy - 0x00000000000005c3 128 13 1 0 0 is_stmt + 0x00000000000005c6 130 16 1 0 0 is_stmt -0x0000096e: 00 DW_LNE_set_address (0x00000000000005cb) -0x00000975: 05 DW_LNS_set_column (22) +0x0000096e: 00 DW_LNE_set_address (0x00000000000005ce) +0x00000975: 05 DW_LNS_set_column (14) 0x00000977: 06 DW_LNS_negate_stmt 0x00000978: 01 DW_LNS_copy - 0x00000000000005cb 128 22 1 0 0 + 0x00000000000005ce 130 14 1 0 0 -0x00000979: 00 DW_LNE_set_address (0x00000000000005d0) -0x00000980: 03 DW_LNS_advance_line (130) -0x00000982: 05 DW_LNS_set_column (16) -0x00000984: 06 DW_LNS_negate_stmt -0x00000985: 01 DW_LNS_copy - 0x00000000000005d0 130 16 1 0 0 is_stmt +0x00000979: 00 DW_LNE_set_address (0x00000000000005dd) +0x00000980: 05 DW_LNS_set_column (25) +0x00000982: 01 DW_LNS_copy + 0x00000000000005dd 130 25 1 0 0 -0x00000986: 00 DW_LNE_set_address (0x00000000000005d8) -0x0000098d: 05 DW_LNS_set_column (14) -0x0000098f: 06 DW_LNS_negate_stmt -0x00000990: 01 DW_LNS_copy - 0x00000000000005d8 130 14 1 0 0 +0x00000983: 00 DW_LNE_set_address (0x00000000000005e4) +0x0000098a: 03 DW_LNS_advance_line (133) +0x0000098c: 05 DW_LNS_set_column (11) +0x0000098e: 06 DW_LNS_negate_stmt +0x0000098f: 01 DW_LNS_copy + 0x00000000000005e4 133 11 1 0 0 is_stmt -0x00000991: 00 DW_LNE_set_address (0x00000000000005e7) -0x00000998: 05 DW_LNS_set_column (25) -0x0000099a: 01 DW_LNS_copy - 0x00000000000005e7 130 25 1 0 0 +0x00000990: 00 DW_LNE_set_address (0x00000000000005e9) +0x00000997: 03 DW_LNS_advance_line (122) +0x00000999: 05 DW_LNS_set_column (16) +0x0000099b: 01 DW_LNS_copy + 0x00000000000005e9 122 16 1 0 0 is_stmt -0x0000099b: 00 DW_LNE_set_address (0x00000000000005ee) -0x000009a2: 03 DW_LNS_advance_line (133) -0x000009a4: 05 DW_LNS_set_column (11) -0x000009a6: 06 DW_LNS_negate_stmt -0x000009a7: 01 DW_LNS_copy - 0x00000000000005ee 133 11 1 0 0 is_stmt +0x0000099c: 00 DW_LNE_set_address (0x00000000000005ee) +0x000009a3: 05 DW_LNS_set_column (14) +0x000009a5: 06 DW_LNS_negate_stmt +0x000009a6: 01 DW_LNS_copy + 0x00000000000005ee 122 14 1 0 0 -0x000009a8: 00 DW_LNE_set_address (0x00000000000005f3) -0x000009af: 03 DW_LNS_advance_line (122) -0x000009b1: 05 DW_LNS_set_column (16) +0x000009a7: 00 DW_LNE_set_address (0x00000000000005f4) +0x000009ae: 03 DW_LNS_advance_line (110) +0x000009b0: 05 DW_LNS_set_column (11) +0x000009b2: 06 DW_LNS_negate_stmt 0x000009b3: 01 DW_LNS_copy - 0x00000000000005f3 122 16 1 0 0 is_stmt + 0x00000000000005f4 110 11 1 0 0 is_stmt -0x000009b4: 00 DW_LNE_set_address (0x00000000000005f8) -0x000009bb: 05 DW_LNS_set_column (14) -0x000009bd: 06 DW_LNS_negate_stmt -0x000009be: 01 DW_LNS_copy - 0x00000000000005f8 122 14 1 0 0 +0x000009b4: 00 DW_LNE_set_address (0x00000000000005fa) +0x000009bb: 03 DW_LNS_advance_line (138) +0x000009bd: 05 DW_LNS_set_column (4) +0x000009bf: 01 DW_LNS_copy + 0x00000000000005fa 138 4 1 0 0 is_stmt -0x000009bf: 00 DW_LNE_set_address (0x00000000000005fe) -0x000009c6: 03 DW_LNS_advance_line (110) -0x000009c8: 05 DW_LNS_set_column (11) -0x000009ca: 06 DW_LNS_negate_stmt -0x000009cb: 01 DW_LNS_copy - 0x00000000000005fe 110 11 1 0 0 is_stmt +0x000009c0: 00 DW_LNE_set_address (0x00000000000005fe) +0x000009c7: 03 DW_LNS_advance_line (139) +0x000009c9: 01 DW_LNS_copy + 0x00000000000005fe 139 4 1 0 0 is_stmt -0x000009cc: 00 DW_LNE_set_address (0x0000000000000604) -0x000009d3: 03 DW_LNS_advance_line (138) -0x000009d5: 05 DW_LNS_set_column (4) -0x000009d7: 01 DW_LNS_copy - 0x0000000000000604 138 4 1 0 0 is_stmt +0x000009ca: 00 DW_LNE_set_address (0x000000000000060e) +0x000009d1: 03 DW_LNS_advance_line (142) +0x000009d3: 05 DW_LNS_set_column (20) +0x000009d5: 01 DW_LNS_copy + 0x000000000000060e 142 20 1 0 0 is_stmt -0x000009d8: 00 DW_LNE_set_address (0x0000000000000608) -0x000009df: 03 DW_LNS_advance_line (139) -0x000009e1: 01 DW_LNS_copy - 0x0000000000000608 139 4 1 0 0 is_stmt +0x000009d6: 00 DW_LNE_set_address (0x0000000000000616) +0x000009dd: 03 DW_LNS_advance_line (146) +0x000009df: 01 DW_LNS_copy + 0x0000000000000616 146 20 1 0 0 is_stmt -0x000009e2: 00 DW_LNE_set_address (0x0000000000000618) -0x000009e9: 03 DW_LNS_advance_line (142) -0x000009eb: 05 DW_LNS_set_column (20) -0x000009ed: 01 DW_LNS_copy - 0x0000000000000618 142 20 1 0 0 is_stmt +0x000009e0: 00 DW_LNE_set_address (0x000000000000061d) +0x000009e7: 03 DW_LNS_advance_line (147) +0x000009e9: 05 DW_LNS_set_column (7) +0x000009eb: 01 DW_LNS_copy + 0x000000000000061d 147 7 1 0 0 is_stmt -0x000009ee: 00 DW_LNE_set_address (0x0000000000000620) -0x000009f5: 03 DW_LNS_advance_line (146) +0x000009ec: 00 DW_LNE_set_address (0x0000000000000621) +0x000009f3: 03 DW_LNS_advance_line (143) +0x000009f5: 05 DW_LNS_set_column (11) 0x000009f7: 01 DW_LNS_copy - 0x0000000000000620 146 20 1 0 0 is_stmt - - -0x000009f8: 00 DW_LNE_set_address (0x0000000000000627) -0x000009ff: 03 DW_LNS_advance_line (147) -0x00000a01: 05 DW_LNS_set_column (7) -0x00000a03: 01 DW_LNS_copy - 0x0000000000000627 147 7 1 0 0 is_stmt - - -0x00000a04: 00 DW_LNE_set_address (0x000000000000062b) -0x00000a0b: 03 DW_LNS_advance_line (143) -0x00000a0d: 05 DW_LNS_set_column (11) -0x00000a0f: 01 DW_LNS_copy - 0x000000000000062b 143 11 1 0 0 is_stmt + 0x0000000000000621 143 11 1 0 0 is_stmt -0x00000a10: 00 DW_LNE_set_address (0x000000000000062f) -0x00000a17: 05 DW_LNS_set_column (20) -0x00000a19: 06 DW_LNS_negate_stmt -0x00000a1a: 01 DW_LNS_copy - 0x000000000000062f 143 20 1 0 0 +0x000009f8: 00 DW_LNE_set_address (0x0000000000000625) +0x000009ff: 05 DW_LNS_set_column (20) +0x00000a01: 06 DW_LNS_negate_stmt +0x00000a02: 01 DW_LNS_copy + 0x0000000000000625 143 20 1 0 0 -0x00000a1b: 00 DW_LNE_set_address (0x0000000000000634) -0x00000a22: 05 DW_LNS_set_column (11) -0x00000a24: 01 DW_LNS_copy - 0x0000000000000634 143 11 1 0 0 +0x00000a03: 00 DW_LNE_set_address (0x000000000000062a) +0x00000a0a: 05 DW_LNS_set_column (11) +0x00000a0c: 01 DW_LNS_copy + 0x000000000000062a 143 11 1 0 0 -0x00000a25: 00 DW_LNE_set_address (0x000000000000063b) -0x00000a2c: 03 DW_LNS_advance_line (141) -0x00000a2e: 05 DW_LNS_set_column (4) -0x00000a30: 06 DW_LNS_negate_stmt -0x00000a31: 01 DW_LNS_copy - 0x000000000000063b 141 4 1 0 0 is_stmt +0x00000a0d: 00 DW_LNE_set_address (0x0000000000000631) +0x00000a14: 03 DW_LNS_advance_line (141) +0x00000a16: 05 DW_LNS_set_column (4) +0x00000a18: 06 DW_LNS_negate_stmt +0x00000a19: 01 DW_LNS_copy + 0x0000000000000631 141 4 1 0 0 is_stmt -0x00000a32: 00 DW_LNE_set_address (0x0000000000000641) -0x00000a39: 03 DW_LNS_advance_line (159) -0x00000a3b: 01 DW_LNS_copy - 0x0000000000000641 159 4 1 0 0 is_stmt +0x00000a1a: 00 DW_LNE_set_address (0x0000000000000637) +0x00000a21: 03 DW_LNS_advance_line (159) +0x00000a23: 01 DW_LNS_copy + 0x0000000000000637 159 4 1 0 0 is_stmt -0x00000a3c: 00 DW_LNE_set_address (0x0000000000000658) -0x00000a43: 03 DW_LNS_advance_line (161) -0x00000a45: 05 DW_LNS_set_column (1) -0x00000a47: 01 DW_LNS_copy - 0x0000000000000658 161 1 1 0 0 is_stmt +0x00000a24: 00 DW_LNE_set_address (0x000000000000064e) +0x00000a2b: 03 DW_LNS_advance_line (161) +0x00000a2d: 05 DW_LNS_set_column (1) +0x00000a2f: 01 DW_LNS_copy + 0x000000000000064e 161 1 1 0 0 is_stmt -0x00000a48: 00 DW_LNE_set_address (0x0000000000000662) -0x00000a4f: 00 DW_LNE_end_sequence - 0x0000000000000662 161 1 1 0 0 is_stmt end_sequence +0x00000a30: 00 DW_LNE_set_address (0x0000000000000658) +0x00000a37: 00 DW_LNE_end_sequence + 0x0000000000000658 161 1 1 0 0 is_stmt end_sequence .debug_str contents: @@ -4660,16 +4646,16 @@ file_names[ 4]: 0x000001ad: "char" .debug_ranges contents: -00000000 0000017f 000001bd -00000000 000001e7 000001f0 -00000000 000002fc 0000033a -00000000 00000364 0000036d +00000000 00000176 000001b4 +00000000 000001de 000001e7 +00000000 000002f2 00000330 +00000000 0000035a 00000363 00000000 -00000028 000004cd 00000512 -00000028 00000585 000005d0 +00000028 000004c3 00000508 +00000028 0000057b 000005c6 00000028 -00000040 00000006 00000381 -00000040 00000383 00000662 +00000040 00000006 00000377 +00000040 00000379 00000658 00000040 (module (type $0 (func (param i32) (result i32))) @@ -4751,698 +4737,685 @@ file_names[ 4]: ) ) ;; code offset: 0x43 - (block $block2 - ;; code offset: 0x45 - (block $block - ;; code offset: 0x4c - (if - ;; code offset: 0x4b - (i32.gt_s - ;; code offset: 0x47 - (local.get $2) - ;; code offset: 0x49 - (i32.const 0) - ) - (then - ;; code offset: 0x4e - (loop $label - ;; code offset: 0x5a - (i32.store - ;; code offset: 0x57 - (i32.add + (block $block1 + ;; code offset: 0x4a + (if + ;; code offset: 0x49 + (i32.gt_s + ;; code offset: 0x45 + (local.get $2) + ;; code offset: 0x47 + (i32.const 0) + ) + (then + ;; code offset: 0x4c + (loop $label + ;; code offset: 0x58 + (i32.store + ;; code offset: 0x55 + (i32.add + ;; code offset: 0x4e + (local.get $3) + ;; code offset: 0x54 + (i32.shl ;; code offset: 0x50 - (local.get $3) - ;; code offset: 0x56 - (i32.shl - ;; code offset: 0x52 - (local.get $1) - ;; code offset: 0x54 - (i32.const 2) - ) + (local.get $1) + ;; code offset: 0x52 + (i32.const 2) ) - ;; code offset: 0x58 - (local.get $1) ) - ;; code offset: 0x67 - (br_if $label - ;; code offset: 0x66 - (i32.ne - ;; code offset: 0x62 - (local.tee $1 - ;; code offset: 0x61 - (i32.add - ;; code offset: 0x5d - (local.get $1) - ;; code offset: 0x5f - (i32.const 1) - ) + ;; code offset: 0x56 + (local.get $1) + ) + ;; code offset: 0x65 + (br_if $label + ;; code offset: 0x64 + (i32.ne + ;; code offset: 0x60 + (local.tee $1 + ;; code offset: 0x5f + (i32.add + ;; code offset: 0x5b + (local.get $1) + ;; code offset: 0x5d + (i32.const 1) ) - ;; code offset: 0x64 - (local.get $2) ) + ;; code offset: 0x62 + (local.get $2) ) ) - ;; code offset: 0x7e - (i32.store - ;; code offset: 0x76 - (i32.add - ;; code offset: 0x6a - (local.get $3) - ;; code offset: 0x75 - (i32.shl - ;; code offset: 0x71 - (local.tee $1 - ;; code offset: 0x6e - (i32.load - ;; code offset: 0x6c - (local.get $0) - ) + ) + ;; code offset: 0x7c + (i32.store + ;; code offset: 0x74 + (i32.add + ;; code offset: 0x68 + (local.get $3) + ;; code offset: 0x73 + (i32.shl + ;; code offset: 0x6f + (local.tee $1 + ;; code offset: 0x6c + (i32.load + ;; code offset: 0x6a + (local.get $0) ) - ;; code offset: 0x73 - (i32.const 2) ) + ;; code offset: 0x71 + (i32.const 2) ) - ;; code offset: 0x7c - (local.tee $4 - ;; code offset: 0x7b - (i32.sub - ;; code offset: 0x77 - (local.get $2) - ;; code offset: 0x79 - (i32.const 1) - ) + ) + ;; code offset: 0x7a + (local.tee $4 + ;; code offset: 0x79 + (i32.sub + ;; code offset: 0x75 + (local.get $2) + ;; code offset: 0x77 + (i32.const 1) ) ) - ;; code offset: 0x8d - (i32.store - ;; code offset: 0x89 - (local.tee $13 - ;; code offset: 0x88 - (i32.add + ) + ;; code offset: 0x8b + (i32.store + ;; code offset: 0x87 + (local.tee $13 + ;; code offset: 0x86 + (i32.add + ;; code offset: 0x7f + (local.get $3) + ;; code offset: 0x85 + (i32.shl ;; code offset: 0x81 - (local.get $3) - ;; code offset: 0x87 - (i32.shl - ;; code offset: 0x83 - (local.get $4) - ;; code offset: 0x85 - (i32.const 2) - ) + (local.get $4) + ;; code offset: 0x83 + (i32.const 2) ) ) - ;; code offset: 0x8b - (local.get $1) ) + ;; code offset: 0x89 + (local.get $1) + ) + ;; code offset: 0x8e + (loop $label5 ;; code offset: 0x95 - (br_if $block + (if ;; code offset: 0x94 - (i32.le_s + (i32.gt_s ;; code offset: 0x90 (local.get $2) ;; code offset: 0x92 - (i32.const 0) + (i32.const 1) ) - ) - ;; code offset: 0x97 - (loop $label5 - ;; code offset: 0x9e - (if - ;; code offset: 0x9d - (i32.gt_s - ;; code offset: 0x99 - (local.get $2) - ;; code offset: 0x9b - (i32.const 1) - ) - (then - ;; code offset: 0xa0 - (loop $label1 - ;; code offset: 0xb1 - (i32.store - ;; code offset: 0xae - (i32.add - ;; code offset: 0xa2 - (local.get $9) - ;; code offset: 0xad - (i32.shl - ;; code offset: 0xa9 - (local.tee $1 - ;; code offset: 0xa8 - (i32.sub - ;; code offset: 0xa4 - (local.get $2) - ;; code offset: 0xa6 - (i32.const 1) - ) - ) - ;; code offset: 0xab - (i32.const 2) - ) - ) - ;; code offset: 0xaf - (local.get $2) - ) - ;; code offset: 0xbd - (br_if $label1 - (block (result i32) - (local.set $scratch - ;; code offset: 0xb8 - (i32.gt_s - ;; code offset: 0xb4 + (then + ;; code offset: 0x97 + (loop $label1 + ;; code offset: 0xa8 + (i32.store + ;; code offset: 0xa5 + (i32.add + ;; code offset: 0x99 + (local.get $9) + ;; code offset: 0xa4 + (i32.shl + ;; code offset: 0xa0 + (local.tee $1 + ;; code offset: 0x9f + (i32.sub + ;; code offset: 0x9b (local.get $2) - ;; code offset: 0xb6 - (i32.const 2) + ;; code offset: 0x9d + (i32.const 1) ) ) - ;; code offset: 0xbb - (local.set $2 - ;; code offset: 0xb9 - (local.get $1) - ) - (local.get $scratch) + ;; code offset: 0xa2 + (i32.const 2) ) ) + ;; code offset: 0xa6 + (local.get $2) ) - ) - ) - ;; code offset: 0xc1 - (block $block1 - ;; code offset: 0xcb - (br_if $block1 - ;; code offset: 0xca - (i32.eqz - ;; code offset: 0xc8 - (local.tee $10 - ;; code offset: 0xc5 - (i32.load - ;; code offset: 0xc3 - (local.get $3) + ;; code offset: 0xb4 + (br_if $label1 + (block (result i32) + (local.set $scratch + ;; code offset: 0xaf + (i32.gt_s + ;; code offset: 0xab + (local.get $2) + ;; code offset: 0xad + (i32.const 2) + ) + ) + ;; code offset: 0xb2 + (local.set $2 + ;; code offset: 0xb0 + (local.get $1) ) + (local.get $scratch) ) ) ) - ;; code offset: 0xd5 - (br_if $block1 - ;; code offset: 0xd4 - (i32.eq - ;; code offset: 0xcf + ) + ) + ;; code offset: 0xb8 + (block $block + ;; code offset: 0xc2 + (br_if $block + ;; code offset: 0xc1 + (i32.eqz + ;; code offset: 0xbf + (local.tee $10 + ;; code offset: 0xbc (i32.load - ;; code offset: 0xcd - (local.get $13) + ;; code offset: 0xba + (local.get $3) ) - ;; code offset: 0xd2 - (local.get $4) ) ) - ;; code offset: 0xe4 - (local.set $6 - ;; code offset: 0xe1 + ) + ;; code offset: 0xcc + (br_if $block + ;; code offset: 0xcb + (i32.eq + ;; code offset: 0xc6 (i32.load - ;; code offset: 0xdf - (local.tee $11 - ;; code offset: 0xdd - (call $memcpy - ;; code offset: 0xd7 - (local.get $8) - ;; code offset: 0xd9 - (local.get $3) - ;; code offset: 0xdb - (local.get $12) - ) + ;; code offset: 0xc4 + (local.get $13) + ) + ;; code offset: 0xc9 + (local.get $4) + ) + ) + ;; code offset: 0xdb + (local.set $6 + ;; code offset: 0xd8 + (i32.load + ;; code offset: 0xd6 + (local.tee $11 + ;; code offset: 0xd4 + (call $memcpy + ;; code offset: 0xce + (local.get $8) + ;; code offset: 0xd0 + (local.get $3) + ;; code offset: 0xd2 + (local.get $12) ) ) ) - ;; code offset: 0xe8 - (local.set $0 - ;; code offset: 0xe6 - (i32.const 0) + ) + ;; code offset: 0xdf + (local.set $0 + ;; code offset: 0xdd + (i32.const 0) + ) + ;; code offset: 0xe1 + (loop $label3 + ;; code offset: 0xe5 + (local.set $16 + ;; code offset: 0xe3 + (local.get $0) ) - ;; code offset: 0xea - (loop $label3 - ;; code offset: 0xee - (local.set $16 - ;; code offset: 0xec - (local.get $0) + ;; code offset: 0xec + (if + ;; code offset: 0xeb + (i32.ge_s + ;; code offset: 0xe7 + (local.get $6) + ;; code offset: 0xe9 + (i32.const 3) ) - ;; code offset: 0xf5 - (if - ;; code offset: 0xf4 - (i32.ge_s - ;; code offset: 0xf0 - (local.get $6) + (then + ;; code offset: 0xf3 + (local.set $1 ;; code offset: 0xf2 - (i32.const 3) - ) - (then - ;; code offset: 0xfc - (local.set $1 - ;; code offset: 0xfb - (i32.sub - ;; code offset: 0xf7 - (local.get $6) - ;; code offset: 0xf9 - (i32.const 1) - ) - ) - ;; code offset: 0x100 - (local.set $0 - ;; code offset: 0xfe + (i32.sub + ;; code offset: 0xee + (local.get $6) + ;; code offset: 0xf0 (i32.const 1) ) - ;; code offset: 0x102 - (loop $label2 - ;; code offset: 0x111 - (local.set $15 - ;; code offset: 0x10e - (i32.load - ;; code offset: 0x10c - (local.tee $14 - ;; code offset: 0x10b - (i32.add - ;; code offset: 0x104 - (local.get $11) - ;; code offset: 0x10a - (i32.shl - ;; code offset: 0x106 - (local.get $0) - ;; code offset: 0x108 - (i32.const 2) - ) + ) + ;; code offset: 0xf7 + (local.set $0 + ;; code offset: 0xf5 + (i32.const 1) + ) + ;; code offset: 0xf9 + (loop $label2 + ;; code offset: 0x108 + (local.set $15 + ;; code offset: 0x105 + (i32.load + ;; code offset: 0x103 + (local.tee $14 + ;; code offset: 0x102 + (i32.add + ;; code offset: 0xfb + (local.get $11) + ;; code offset: 0x101 + (i32.shl + ;; code offset: 0xfd + (local.get $0) + ;; code offset: 0xff + (i32.const 2) ) ) ) ) - ;; code offset: 0x122 - (i32.store - ;; code offset: 0x113 - (local.get $14) - ;; code offset: 0x11f - (i32.load - ;; code offset: 0x11d - (local.tee $7 - ;; code offset: 0x11c - (i32.add - ;; code offset: 0x115 - (local.get $11) - ;; code offset: 0x11b - (i32.shl - ;; code offset: 0x117 - (local.get $1) - ;; code offset: 0x119 - (i32.const 2) - ) + ) + ;; code offset: 0x119 + (i32.store + ;; code offset: 0x10a + (local.get $14) + ;; code offset: 0x116 + (i32.load + ;; code offset: 0x114 + (local.tee $7 + ;; code offset: 0x113 + (i32.add + ;; code offset: 0x10c + (local.get $11) + ;; code offset: 0x112 + (i32.shl + ;; code offset: 0x10e + (local.get $1) + ;; code offset: 0x110 + (i32.const 2) ) ) ) ) - ;; code offset: 0x129 - (i32.store - ;; code offset: 0x125 - (local.get $7) - ;; code offset: 0x127 - (local.get $15) - ) - ;; code offset: 0x13b - (br_if $label2 - ;; code offset: 0x13a - (i32.lt_s - ;; code offset: 0x131 - (local.tee $0 - ;; code offset: 0x130 - (i32.add - ;; code offset: 0x12c - (local.get $0) - ;; code offset: 0x12e - (i32.const 1) - ) + ) + ;; code offset: 0x120 + (i32.store + ;; code offset: 0x11c + (local.get $7) + ;; code offset: 0x11e + (local.get $15) + ) + ;; code offset: 0x132 + (br_if $label2 + ;; code offset: 0x131 + (i32.lt_s + ;; code offset: 0x128 + (local.tee $0 + ;; code offset: 0x127 + (i32.add + ;; code offset: 0x123 + (local.get $0) + ;; code offset: 0x125 + (i32.const 1) ) - ;; code offset: 0x138 - (local.tee $1 - ;; code offset: 0x137 - (i32.sub - ;; code offset: 0x133 - (local.get $1) - ;; code offset: 0x135 - (i32.const 1) - ) + ) + ;; code offset: 0x12f + (local.tee $1 + ;; code offset: 0x12e + (i32.sub + ;; code offset: 0x12a + (local.get $1) + ;; code offset: 0x12c + (i32.const 1) ) ) ) ) ) ) - ;; code offset: 0x14c - (local.set $1 - ;; code offset: 0x149 - (i32.load - ;; code offset: 0x147 - (local.tee $0 - ;; code offset: 0x146 - (i32.add - ;; code offset: 0x13f - (local.get $11) - ;; code offset: 0x145 - (i32.shl - ;; code offset: 0x141 - (local.get $6) - ;; code offset: 0x143 - (i32.const 2) - ) + ) + ;; code offset: 0x143 + (local.set $1 + ;; code offset: 0x140 + (i32.load + ;; code offset: 0x13e + (local.tee $0 + ;; code offset: 0x13d + (i32.add + ;; code offset: 0x136 + (local.get $11) + ;; code offset: 0x13c + (i32.shl + ;; code offset: 0x138 + (local.get $6) + ;; code offset: 0x13a + (i32.const 2) ) ) ) ) - ;; code offset: 0x152 - (i32.store + ) + ;; code offset: 0x149 + (i32.store + ;; code offset: 0x145 + (local.get $0) + ;; code offset: 0x147 + (local.get $6) + ) + ;; code offset: 0x151 + (local.set $0 + ;; code offset: 0x150 + (i32.add + ;; code offset: 0x14c + (local.get $16) ;; code offset: 0x14e - (local.get $0) - ;; code offset: 0x150 - (local.get $6) - ) - ;; code offset: 0x15a - (local.set $0 - ;; code offset: 0x159 - (i32.add - ;; code offset: 0x155 - (local.get $16) - ;; code offset: 0x157 - (i32.const 1) - ) + (i32.const 1) ) + ) + ;; code offset: 0x155 + (local.set $6 + ;; code offset: 0x153 + (local.get $1) + ) + ;; code offset: 0x159 + (br_if $label3 + ;; code offset: 0x157 + (local.get $1) + ) + ) + ;; code offset: 0x166 + (local.set $5 + ;; code offset: 0x165 + (select + ;; code offset: 0x15c + (local.get $5) ;; code offset: 0x15e - (local.set $6 - ;; code offset: 0x15c - (local.get $1) - ) - ;; code offset: 0x162 - (br_if $label3 + (local.get $0) + ;; code offset: 0x164 + (i32.gt_s ;; code offset: 0x160 - (local.get $1) - ) - ) - ;; code offset: 0x16f - (local.set $5 - ;; code offset: 0x16e - (select - ;; code offset: 0x165 (local.get $5) - ;; code offset: 0x167 - (local.get $0) - ;; code offset: 0x16d - (i32.gt_s - ;; code offset: 0x169 - (local.get $5) - ;; code offset: 0x16b - (local.get $16) - ) + ;; code offset: 0x162 + (local.get $16) ) ) ) - ;; code offset: 0x177 - (br_if $block2 - ;; code offset: 0x176 - (i32.ge_s - ;; code offset: 0x172 - (local.get $2) - ;; code offset: 0x174 - (local.get $4) - ) + ) + ;; code offset: 0x16e + (br_if $block1 + ;; code offset: 0x16d + (i32.ge_s + ;; code offset: 0x169 + (local.get $2) + ;; code offset: 0x16b + (local.get $4) ) - ;; code offset: 0x179 - (loop $label6 - ;; code offset: 0x17d - (local.set $1 - ;; code offset: 0x17b + ) + ;; code offset: 0x170 + (loop $label6 + ;; code offset: 0x174 + (local.set $1 + ;; code offset: 0x172 + (i32.const 0) + ) + ;; code offset: 0x17b + (if + ;; code offset: 0x17a + (i32.gt_s + ;; code offset: 0x176 + (local.get $2) + ;; code offset: 0x178 (i32.const 0) ) - ;; code offset: 0x184 - (if - ;; code offset: 0x183 - (i32.gt_s - ;; code offset: 0x17f - (local.get $2) - ;; code offset: 0x181 - (i32.const 0) - ) - (then - ;; code offset: 0x186 - (loop $label4 - ;; code offset: 0x1a0 - (i32.store - ;; code offset: 0x18f + (then + ;; code offset: 0x17d + (loop $label4 + ;; code offset: 0x197 + (i32.store + ;; code offset: 0x186 + (i32.add + ;; code offset: 0x17f + (local.get $3) + ;; code offset: 0x185 + (i32.shl + ;; code offset: 0x181 + (local.get $1) + ;; code offset: 0x183 + (i32.const 2) + ) + ) + ;; code offset: 0x194 + (i32.load + ;; code offset: 0x193 (i32.add - ;; code offset: 0x188 + ;; code offset: 0x187 (local.get $3) - ;; code offset: 0x18e + ;; code offset: 0x192 (i32.shl - ;; code offset: 0x18a - (local.get $1) - ;; code offset: 0x18c - (i32.const 2) - ) - ) - ;; code offset: 0x19d - (i32.load - ;; code offset: 0x19c - (i32.add - ;; code offset: 0x190 - (local.get $3) - ;; code offset: 0x19b - (i32.shl - ;; code offset: 0x197 - (local.tee $1 - ;; code offset: 0x196 - (i32.add - ;; code offset: 0x192 - (local.get $1) - ;; code offset: 0x194 - (i32.const 1) - ) + ;; code offset: 0x18e + (local.tee $1 + ;; code offset: 0x18d + (i32.add + ;; code offset: 0x189 + (local.get $1) + ;; code offset: 0x18b + (i32.const 1) ) - ;; code offset: 0x199 - (i32.const 2) ) + ;; code offset: 0x190 + (i32.const 2) ) ) ) - ;; code offset: 0x1a8 - (br_if $label4 - ;; code offset: 0x1a7 - (i32.ne - ;; code offset: 0x1a3 - (local.get $1) - ;; code offset: 0x1a5 - (local.get $2) - ) - ) ) - ;; code offset: 0x1ad - (local.set $1 - ;; code offset: 0x1ab - (local.get $2) + ;; code offset: 0x19f + (br_if $label4 + ;; code offset: 0x19e + (i32.ne + ;; code offset: 0x19a + (local.get $1) + ;; code offset: 0x19c + (local.get $2) + ) ) ) + ;; code offset: 0x1a4 + (local.set $1 + ;; code offset: 0x1a2 + (local.get $2) + ) ) - ;; code offset: 0x1ba - (i32.store - ;; code offset: 0x1b7 + ) + ;; code offset: 0x1b1 + (i32.store + ;; code offset: 0x1ae + (i32.add + ;; code offset: 0x1a7 + (local.get $3) + ;; code offset: 0x1ad + (i32.shl + ;; code offset: 0x1a9 + (local.get $1) + ;; code offset: 0x1ab + (i32.const 2) + ) + ) + ;; code offset: 0x1af + (local.get $10) + ) + ;; code offset: 0x1c8 + (i32.store + ;; code offset: 0x1bc + (local.tee $1 + ;; code offset: 0x1bb (i32.add - ;; code offset: 0x1b0 - (local.get $3) - ;; code offset: 0x1b6 + ;; code offset: 0x1b4 + (local.get $9) + ;; code offset: 0x1ba (i32.shl - ;; code offset: 0x1b2 - (local.get $1) - ;; code offset: 0x1b4 + ;; code offset: 0x1b6 + (local.get $2) + ;; code offset: 0x1b8 (i32.const 2) ) ) - ;; code offset: 0x1b8 - (local.get $10) ) - ;; code offset: 0x1d1 - (i32.store - ;; code offset: 0x1c5 + ;; code offset: 0x1c7 + (i32.sub + ;; code offset: 0x1c3 (local.tee $1 - ;; code offset: 0x1c4 - (i32.add - ;; code offset: 0x1bd - (local.get $9) - ;; code offset: 0x1c3 - (i32.shl - ;; code offset: 0x1bf - (local.get $2) - ;; code offset: 0x1c1 - (i32.const 2) - ) - ) - ) - ;; code offset: 0x1d0 - (i32.sub - ;; code offset: 0x1cc - (local.tee $1 - ;; code offset: 0x1c9 - (i32.load - ;; code offset: 0x1c7 - (local.get $1) - ) + ;; code offset: 0x1c0 + (i32.load + ;; code offset: 0x1be + (local.get $1) ) - ;; code offset: 0x1ce - (i32.const 1) ) + ;; code offset: 0x1c5 + (i32.const 1) ) - ;; code offset: 0x1d9 - (br_if $label5 - ;; code offset: 0x1d8 - (i32.gt_s - ;; code offset: 0x1d4 - (local.get $1) - ;; code offset: 0x1d6 - (i32.const 1) - ) + ) + ;; code offset: 0x1d0 + (br_if $label5 + ;; code offset: 0x1cf + (i32.gt_s + ;; code offset: 0x1cb + (local.get $1) + ;; code offset: 0x1cd + (i32.const 1) ) - ;; code offset: 0x1e5 - (br_if $block2 - ;; code offset: 0x1e4 - (i32.eq - ;; code offset: 0x1e0 - (local.tee $2 - ;; code offset: 0x1df - (i32.add - ;; code offset: 0x1db - (local.get $2) - ;; code offset: 0x1dd - (i32.const 1) - ) + ) + ;; code offset: 0x1dc + (br_if $block1 + ;; code offset: 0x1db + (i32.eq + ;; code offset: 0x1d7 + (local.tee $2 + ;; code offset: 0x1d6 + (i32.add + ;; code offset: 0x1d2 + (local.get $2) + ;; code offset: 0x1d4 + (i32.const 1) ) - ;; code offset: 0x1e2 - (local.get $4) ) + ;; code offset: 0x1d9 + (local.get $4) ) - ;; code offset: 0x1ec - (local.set $10 - ;; code offset: 0x1e9 - (i32.load - ;; code offset: 0x1e7 - (local.get $3) - ) + ) + ;; code offset: 0x1e3 + (local.set $10 + ;; code offset: 0x1e0 + (i32.load + ;; code offset: 0x1de + (local.get $3) ) - ;; code offset: 0x1ee - (br $label6) ) - ;; code offset: 0x1f1 - (unreachable) + ;; code offset: 0x1e5 + (br $label6) ) - ;; code offset: 0x1f3 + ;; code offset: 0x1e8 (unreachable) ) + ;; code offset: 0x1ea + (unreachable) ) - ;; code offset: 0x209 - (i32.store - ;; code offset: 0x201 - (i32.add - ;; code offset: 0x1f5 - (local.get $3) - ;; code offset: 0x200 - (i32.shl - ;; code offset: 0x1fc - (local.tee $1 - ;; code offset: 0x1f9 - (i32.load - ;; code offset: 0x1f7 - (local.get $0) - ) + ) + ;; code offset: 0x200 + (i32.store + ;; code offset: 0x1f8 + (i32.add + ;; code offset: 0x1ec + (local.get $3) + ;; code offset: 0x1f7 + (i32.shl + ;; code offset: 0x1f3 + (local.tee $1 + ;; code offset: 0x1f0 + (i32.load + ;; code offset: 0x1ee + (local.get $0) ) - ;; code offset: 0x1fe - (i32.const 2) ) + ;; code offset: 0x1f5 + (i32.const 2) ) - ;; code offset: 0x207 - (local.tee $4 - ;; code offset: 0x206 - (i32.sub - ;; code offset: 0x202 - (local.get $2) - ;; code offset: 0x204 - (i32.const 1) - ) + ) + ;; code offset: 0x1fe + (local.tee $4 + ;; code offset: 0x1fd + (i32.sub + ;; code offset: 0x1f9 + (local.get $2) + ;; code offset: 0x1fb + (i32.const 1) ) ) - ;; code offset: 0x218 - (i32.store - ;; code offset: 0x214 - (local.tee $13 - ;; code offset: 0x213 - (i32.add - ;; code offset: 0x20c - (local.get $3) - ;; code offset: 0x212 - (i32.shl - ;; code offset: 0x20e - (local.get $4) - ;; code offset: 0x210 - (i32.const 2) - ) + ) + ;; code offset: 0x20f + (i32.store + ;; code offset: 0x20b + (local.tee $13 + ;; code offset: 0x20a + (i32.add + ;; code offset: 0x203 + (local.get $3) + ;; code offset: 0x209 + (i32.shl + ;; code offset: 0x205 + (local.get $4) + ;; code offset: 0x207 + (i32.const 2) ) ) - ;; code offset: 0x216 - (local.get $1) ) + ;; code offset: 0x20d + (local.get $1) ) - ;; code offset: 0x21c + ;; code offset: 0x212 (loop $label11 - ;; code offset: 0x223 + ;; code offset: 0x219 (if - ;; code offset: 0x222 + ;; code offset: 0x218 (i32.ge_s - ;; code offset: 0x21e + ;; code offset: 0x214 (local.get $2) - ;; code offset: 0x220 + ;; code offset: 0x216 (i32.const 2) ) (then - ;; code offset: 0x225 + ;; code offset: 0x21b (loop $label7 - ;; code offset: 0x236 + ;; code offset: 0x22c (i32.store - ;; code offset: 0x233 + ;; code offset: 0x229 (i32.add - ;; code offset: 0x227 + ;; code offset: 0x21d (local.get $9) - ;; code offset: 0x232 + ;; code offset: 0x228 (i32.shl - ;; code offset: 0x22e + ;; code offset: 0x224 (local.tee $1 - ;; code offset: 0x22d + ;; code offset: 0x223 (i32.sub - ;; code offset: 0x229 + ;; code offset: 0x21f (local.get $2) - ;; code offset: 0x22b + ;; code offset: 0x221 (i32.const 1) ) ) - ;; code offset: 0x230 + ;; code offset: 0x226 (i32.const 2) ) ) - ;; code offset: 0x234 + ;; code offset: 0x22a (local.get $2) ) - ;; code offset: 0x242 + ;; code offset: 0x238 (br_if $label7 (block (result i32) (local.set $scratch_18 - ;; code offset: 0x23d + ;; code offset: 0x233 (i32.gt_s - ;; code offset: 0x239 + ;; code offset: 0x22f (local.get $2) - ;; code offset: 0x23b + ;; code offset: 0x231 (i32.const 2) ) ) - ;; code offset: 0x240 + ;; code offset: 0x236 (local.set $2 - ;; code offset: 0x23e + ;; code offset: 0x234 (local.get $1) ) (local.get $scratch_18) @@ -5451,154 +5424,154 @@ file_names[ 4]: ) ) ) - ;; code offset: 0x246 - (block $block3 - ;; code offset: 0x250 - (br_if $block3 - ;; code offset: 0x24f + ;; code offset: 0x23c + (block $block2 + ;; code offset: 0x246 + (br_if $block2 + ;; code offset: 0x245 (i32.eqz - ;; code offset: 0x24d + ;; code offset: 0x243 (local.tee $6 - ;; code offset: 0x24a + ;; code offset: 0x240 (i32.load - ;; code offset: 0x248 + ;; code offset: 0x23e (local.get $3) ) ) ) ) - ;; code offset: 0x25a - (br_if $block3 - ;; code offset: 0x259 + ;; code offset: 0x250 + (br_if $block2 + ;; code offset: 0x24f (i32.eq - ;; code offset: 0x254 + ;; code offset: 0x24a (i32.load - ;; code offset: 0x252 + ;; code offset: 0x248 (local.get $13) ) - ;; code offset: 0x257 + ;; code offset: 0x24d (local.get $4) ) ) - ;; code offset: 0x261 + ;; code offset: 0x257 (local.set $7 - ;; code offset: 0x25e + ;; code offset: 0x254 (i32.load - ;; code offset: 0x25c + ;; code offset: 0x252 (local.get $8) ) ) - ;; code offset: 0x265 + ;; code offset: 0x25b (local.set $0 - ;; code offset: 0x263 + ;; code offset: 0x259 (i32.const 0) ) - ;; code offset: 0x267 + ;; code offset: 0x25d (loop $label9 - ;; code offset: 0x26b + ;; code offset: 0x261 (local.set $10 - ;; code offset: 0x269 + ;; code offset: 0x25f (local.get $0) ) - ;; code offset: 0x272 + ;; code offset: 0x268 (if - ;; code offset: 0x271 + ;; code offset: 0x267 (i32.ge_s - ;; code offset: 0x26d + ;; code offset: 0x263 (local.get $7) - ;; code offset: 0x26f + ;; code offset: 0x265 (i32.const 3) ) (then - ;; code offset: 0x279 + ;; code offset: 0x26f (local.set $1 - ;; code offset: 0x278 + ;; code offset: 0x26e (i32.sub - ;; code offset: 0x274 + ;; code offset: 0x26a (local.get $7) - ;; code offset: 0x276 + ;; code offset: 0x26c (i32.const 1) ) ) - ;; code offset: 0x27d + ;; code offset: 0x273 (local.set $0 - ;; code offset: 0x27b + ;; code offset: 0x271 (i32.const 1) ) - ;; code offset: 0x27f + ;; code offset: 0x275 (loop $label8 - ;; code offset: 0x28e + ;; code offset: 0x284 (local.set $14 - ;; code offset: 0x28b + ;; code offset: 0x281 (i32.load - ;; code offset: 0x289 + ;; code offset: 0x27f (local.tee $11 - ;; code offset: 0x288 + ;; code offset: 0x27e (i32.add - ;; code offset: 0x281 + ;; code offset: 0x277 (local.get $8) - ;; code offset: 0x287 + ;; code offset: 0x27d (i32.shl - ;; code offset: 0x283 + ;; code offset: 0x279 (local.get $0) - ;; code offset: 0x285 + ;; code offset: 0x27b (i32.const 2) ) ) ) ) ) - ;; code offset: 0x29f + ;; code offset: 0x295 (i32.store - ;; code offset: 0x290 + ;; code offset: 0x286 (local.get $11) - ;; code offset: 0x29c + ;; code offset: 0x292 (i32.load - ;; code offset: 0x29a + ;; code offset: 0x290 (local.tee $15 - ;; code offset: 0x299 + ;; code offset: 0x28f (i32.add - ;; code offset: 0x292 + ;; code offset: 0x288 (local.get $8) - ;; code offset: 0x298 + ;; code offset: 0x28e (i32.shl - ;; code offset: 0x294 + ;; code offset: 0x28a (local.get $1) - ;; code offset: 0x296 + ;; code offset: 0x28c (i32.const 2) ) ) ) ) ) - ;; code offset: 0x2a6 + ;; code offset: 0x29c (i32.store - ;; code offset: 0x2a2 + ;; code offset: 0x298 (local.get $15) - ;; code offset: 0x2a4 + ;; code offset: 0x29a (local.get $14) ) - ;; code offset: 0x2b8 + ;; code offset: 0x2ae (br_if $label8 - ;; code offset: 0x2b7 + ;; code offset: 0x2ad (i32.lt_s - ;; code offset: 0x2ae + ;; code offset: 0x2a4 (local.tee $0 - ;; code offset: 0x2ad + ;; code offset: 0x2a3 (i32.add - ;; code offset: 0x2a9 + ;; code offset: 0x29f (local.get $0) - ;; code offset: 0x2ab + ;; code offset: 0x2a1 (i32.const 1) ) ) - ;; code offset: 0x2b5 + ;; code offset: 0x2ab (local.tee $1 - ;; code offset: 0x2b4 + ;; code offset: 0x2aa (i32.sub - ;; code offset: 0x2b0 + ;; code offset: 0x2a6 (local.get $1) - ;; code offset: 0x2b2 + ;; code offset: 0x2a8 (i32.const 1) ) ) @@ -5607,267 +5580,267 @@ file_names[ 4]: ) ) ) - ;; code offset: 0x2c9 + ;; code offset: 0x2bf (local.set $1 - ;; code offset: 0x2c6 + ;; code offset: 0x2bc (i32.load - ;; code offset: 0x2c4 + ;; code offset: 0x2ba (local.tee $0 - ;; code offset: 0x2c3 + ;; code offset: 0x2b9 (i32.add - ;; code offset: 0x2bc + ;; code offset: 0x2b2 (local.get $8) - ;; code offset: 0x2c2 + ;; code offset: 0x2b8 (i32.shl - ;; code offset: 0x2be + ;; code offset: 0x2b4 (local.get $7) - ;; code offset: 0x2c0 + ;; code offset: 0x2b6 (i32.const 2) ) ) ) ) ) - ;; code offset: 0x2cf + ;; code offset: 0x2c5 (i32.store - ;; code offset: 0x2cb + ;; code offset: 0x2c1 (local.get $0) - ;; code offset: 0x2cd + ;; code offset: 0x2c3 (local.get $7) ) - ;; code offset: 0x2d7 + ;; code offset: 0x2cd (local.set $0 - ;; code offset: 0x2d6 + ;; code offset: 0x2cc (i32.add - ;; code offset: 0x2d2 + ;; code offset: 0x2c8 (local.get $10) - ;; code offset: 0x2d4 + ;; code offset: 0x2ca (i32.const 1) ) ) - ;; code offset: 0x2db + ;; code offset: 0x2d1 (local.set $7 - ;; code offset: 0x2d9 + ;; code offset: 0x2cf (local.get $1) ) - ;; code offset: 0x2df + ;; code offset: 0x2d5 (br_if $label9 - ;; code offset: 0x2dd + ;; code offset: 0x2d3 (local.get $1) ) ) - ;; code offset: 0x2ec + ;; code offset: 0x2e2 (local.set $5 - ;; code offset: 0x2eb + ;; code offset: 0x2e1 (select - ;; code offset: 0x2e2 + ;; code offset: 0x2d8 (local.get $5) - ;; code offset: 0x2e4 + ;; code offset: 0x2da (local.get $0) - ;; code offset: 0x2ea + ;; code offset: 0x2e0 (i32.gt_s - ;; code offset: 0x2e6 + ;; code offset: 0x2dc (local.get $5) - ;; code offset: 0x2e8 + ;; code offset: 0x2de (local.get $10) ) ) ) ) - ;; code offset: 0x2f4 - (br_if $block2 - ;; code offset: 0x2f3 + ;; code offset: 0x2ea + (br_if $block1 + ;; code offset: 0x2e9 (i32.ge_s - ;; code offset: 0x2ef + ;; code offset: 0x2e5 (local.get $2) - ;; code offset: 0x2f1 + ;; code offset: 0x2e7 (local.get $4) ) ) - ;; code offset: 0x2f6 + ;; code offset: 0x2ec (loop $label12 - ;; code offset: 0x2fa + ;; code offset: 0x2f0 (local.set $1 - ;; code offset: 0x2f8 + ;; code offset: 0x2ee (i32.const 0) ) - ;; code offset: 0x301 + ;; code offset: 0x2f7 (if - ;; code offset: 0x300 + ;; code offset: 0x2f6 (i32.gt_s - ;; code offset: 0x2fc + ;; code offset: 0x2f2 (local.get $2) - ;; code offset: 0x2fe + ;; code offset: 0x2f4 (i32.const 0) ) (then - ;; code offset: 0x303 + ;; code offset: 0x2f9 (loop $label10 - ;; code offset: 0x31d + ;; code offset: 0x313 (i32.store - ;; code offset: 0x30c + ;; code offset: 0x302 (i32.add - ;; code offset: 0x305 + ;; code offset: 0x2fb (local.get $3) - ;; code offset: 0x30b + ;; code offset: 0x301 (i32.shl - ;; code offset: 0x307 + ;; code offset: 0x2fd (local.get $1) - ;; code offset: 0x309 + ;; code offset: 0x2ff (i32.const 2) ) ) - ;; code offset: 0x31a + ;; code offset: 0x310 (i32.load - ;; code offset: 0x319 + ;; code offset: 0x30f (i32.add - ;; code offset: 0x30d + ;; code offset: 0x303 (local.get $3) - ;; code offset: 0x318 + ;; code offset: 0x30e (i32.shl - ;; code offset: 0x314 + ;; code offset: 0x30a (local.tee $1 - ;; code offset: 0x313 + ;; code offset: 0x309 (i32.add - ;; code offset: 0x30f + ;; code offset: 0x305 (local.get $1) - ;; code offset: 0x311 + ;; code offset: 0x307 (i32.const 1) ) ) - ;; code offset: 0x316 + ;; code offset: 0x30c (i32.const 2) ) ) ) ) - ;; code offset: 0x325 + ;; code offset: 0x31b (br_if $label10 - ;; code offset: 0x324 + ;; code offset: 0x31a (i32.ne - ;; code offset: 0x320 + ;; code offset: 0x316 (local.get $1) - ;; code offset: 0x322 + ;; code offset: 0x318 (local.get $2) ) ) ) - ;; code offset: 0x32a + ;; code offset: 0x320 (local.set $1 - ;; code offset: 0x328 + ;; code offset: 0x31e (local.get $2) ) ) ) - ;; code offset: 0x337 + ;; code offset: 0x32d (i32.store - ;; code offset: 0x334 + ;; code offset: 0x32a (i32.add - ;; code offset: 0x32d + ;; code offset: 0x323 (local.get $3) - ;; code offset: 0x333 + ;; code offset: 0x329 (i32.shl - ;; code offset: 0x32f + ;; code offset: 0x325 (local.get $1) - ;; code offset: 0x331 + ;; code offset: 0x327 (i32.const 2) ) ) - ;; code offset: 0x335 + ;; code offset: 0x32b (local.get $6) ) - ;; code offset: 0x34e + ;; code offset: 0x344 (i32.store - ;; code offset: 0x342 + ;; code offset: 0x338 (local.tee $1 - ;; code offset: 0x341 + ;; code offset: 0x337 (i32.add - ;; code offset: 0x33a + ;; code offset: 0x330 (local.get $9) - ;; code offset: 0x340 + ;; code offset: 0x336 (i32.shl - ;; code offset: 0x33c + ;; code offset: 0x332 (local.get $2) - ;; code offset: 0x33e + ;; code offset: 0x334 (i32.const 2) ) ) ) - ;; code offset: 0x34d + ;; code offset: 0x343 (i32.sub - ;; code offset: 0x349 + ;; code offset: 0x33f (local.tee $1 - ;; code offset: 0x346 + ;; code offset: 0x33c (i32.load - ;; code offset: 0x344 + ;; code offset: 0x33a (local.get $1) ) ) - ;; code offset: 0x34b + ;; code offset: 0x341 (i32.const 1) ) ) - ;; code offset: 0x356 + ;; code offset: 0x34c (br_if $label11 - ;; code offset: 0x355 + ;; code offset: 0x34b (i32.gt_s - ;; code offset: 0x351 + ;; code offset: 0x347 (local.get $1) - ;; code offset: 0x353 + ;; code offset: 0x349 (i32.const 1) ) ) - ;; code offset: 0x362 - (br_if $block2 - ;; code offset: 0x361 + ;; code offset: 0x358 + (br_if $block1 + ;; code offset: 0x357 (i32.eq - ;; code offset: 0x35d + ;; code offset: 0x353 (local.tee $2 - ;; code offset: 0x35c + ;; code offset: 0x352 (i32.add - ;; code offset: 0x358 + ;; code offset: 0x34e (local.get $2) - ;; code offset: 0x35a + ;; code offset: 0x350 (i32.const 1) ) ) - ;; code offset: 0x35f + ;; code offset: 0x355 (local.get $4) ) ) - ;; code offset: 0x369 + ;; code offset: 0x35f (local.set $6 - ;; code offset: 0x366 + ;; code offset: 0x35c (i32.load - ;; code offset: 0x364 + ;; code offset: 0x35a (local.get $3) ) ) - ;; code offset: 0x36b + ;; code offset: 0x361 (br $label12) ) - ;; code offset: 0x36e + ;; code offset: 0x364 (unreachable) ) - ;; code offset: 0x370 + ;; code offset: 0x366 (unreachable) ) - ;; code offset: 0x374 + ;; code offset: 0x36a (call $free - ;; code offset: 0x372 + ;; code offset: 0x368 (local.get $3) ) - ;; code offset: 0x378 + ;; code offset: 0x36e (call $free - ;; code offset: 0x376 + ;; code offset: 0x36c (local.get $8) ) - ;; code offset: 0x37c + ;; code offset: 0x372 (call $free - ;; code offset: 0x37a + ;; code offset: 0x370 (local.get $9) ) - ;; code offset: 0x37e + ;; code offset: 0x374 (local.get $5) ) (func $main (param $0 i32) (param $1 i32) (result i32) @@ -5880,393 +5853,393 @@ file_names[ 4]: (local $8 i32) (local $scratch i32) (local $scratch_10 i32) - ;; code offset: 0x399 + ;; code offset: 0x38f (global.set $global$0 - ;; code offset: 0x397 + ;; code offset: 0x38d (local.tee $8 - ;; code offset: 0x396 + ;; code offset: 0x38c (i32.sub - ;; code offset: 0x392 + ;; code offset: 0x388 (global.get $global$0) - ;; code offset: 0x394 + ;; code offset: 0x38a (i32.const 32) ) ) ) - ;; code offset: 0x39b + ;; code offset: 0x391 (block $block1 - ;; code offset: 0x39d + ;; code offset: 0x393 (block $block - ;; code offset: 0x3a4 + ;; code offset: 0x39a (if - ;; code offset: 0x3a3 + ;; code offset: 0x399 (i32.ge_s - ;; code offset: 0x39f + ;; code offset: 0x395 (local.get $0) - ;; code offset: 0x3a1 + ;; code offset: 0x397 (i32.const 2) ) (then - ;; code offset: 0x3b2 + ;; code offset: 0x3a8 (br_if $block - ;; code offset: 0x3b1 + ;; code offset: 0x3a7 (i32.gt_s - ;; code offset: 0x3ad + ;; code offset: 0x3a3 (local.tee $3 - ;; code offset: 0x3ab + ;; code offset: 0x3a1 (call $atoi - ;; code offset: 0x3a8 + ;; code offset: 0x39e (i32.load offset=4 - ;; code offset: 0x3a6 + ;; code offset: 0x39c (local.get $1) ) ) ) - ;; code offset: 0x3af + ;; code offset: 0x3a5 (i32.const 0) ) ) ) ) - ;; code offset: 0x3ba + ;; code offset: 0x3b0 (drop - ;; code offset: 0x3b8 + ;; code offset: 0x3ae (call $puts - ;; code offset: 0x3b5 + ;; code offset: 0x3ab (i32.const 1050) ) ) - ;; code offset: 0x3bd + ;; code offset: 0x3b3 (local.set $5 - ;; code offset: 0x3bb + ;; code offset: 0x3b1 (i32.const 1) ) - ;; code offset: 0x3bf + ;; code offset: 0x3b5 (br $block1) ) - ;; code offset: 0x3c7 + ;; code offset: 0x3bd (if - ;; code offset: 0x3c6 + ;; code offset: 0x3bc (i32.ne - ;; code offset: 0x3c2 + ;; code offset: 0x3b8 (local.get $3) - ;; code offset: 0x3c4 + ;; code offset: 0x3ba (i32.const 1) ) (then - ;; code offset: 0x3ce + ;; code offset: 0x3c4 (local.set $2 - ;; code offset: 0x3cd + ;; code offset: 0x3c3 (i32.sub - ;; code offset: 0x3c9 + ;; code offset: 0x3bf (local.get $3) - ;; code offset: 0x3cb + ;; code offset: 0x3c1 (i32.const 1) ) ) - ;; code offset: 0x3d2 + ;; code offset: 0x3c8 (local.set $1 - ;; code offset: 0x3d0 + ;; code offset: 0x3c6 (i32.const 0) ) - ;; code offset: 0x3d6 + ;; code offset: 0x3cc (local.set $0 - ;; code offset: 0x3d4 + ;; code offset: 0x3ca (i32.const 0) ) - ;; code offset: 0x3d8 + ;; code offset: 0x3ce (loop $label - ;; code offset: 0x3e2 + ;; code offset: 0x3d8 (i32.store offset=8 - ;; code offset: 0x3de + ;; code offset: 0x3d4 (local.tee $4 - ;; code offset: 0x3dc + ;; code offset: 0x3d2 (call $malloc - ;; code offset: 0x3da + ;; code offset: 0x3d0 (i32.const 12) ) ) - ;; code offset: 0x3e0 + ;; code offset: 0x3d6 (local.get $1) ) - ;; code offset: 0x3e9 + ;; code offset: 0x3df (i32.store offset=4 - ;; code offset: 0x3e5 + ;; code offset: 0x3db (local.get $4) - ;; code offset: 0x3e7 + ;; code offset: 0x3dd (local.get $3) ) - ;; code offset: 0x3f0 + ;; code offset: 0x3e6 (i32.store - ;; code offset: 0x3ec + ;; code offset: 0x3e2 (local.get $4) - ;; code offset: 0x3ee + ;; code offset: 0x3e4 (local.get $0) ) - ;; code offset: 0x3f5 + ;; code offset: 0x3eb (local.set $1 - ;; code offset: 0x3f3 + ;; code offset: 0x3e9 (local.get $4) ) - ;; code offset: 0x401 + ;; code offset: 0x3f7 (br_if $label - ;; code offset: 0x400 + ;; code offset: 0x3f6 (i32.ne - ;; code offset: 0x3fc + ;; code offset: 0x3f2 (local.tee $0 - ;; code offset: 0x3fb + ;; code offset: 0x3f1 (i32.add - ;; code offset: 0x3f7 + ;; code offset: 0x3ed (local.get $0) - ;; code offset: 0x3f9 + ;; code offset: 0x3ef (i32.const 1) ) ) - ;; code offset: 0x3fe + ;; code offset: 0x3f4 (local.get $2) ) ) ) ) ) - ;; code offset: 0x407 + ;; code offset: 0x3fd (local.set $0 - ;; code offset: 0x405 + ;; code offset: 0x3fb (i32.const 0) ) - ;; code offset: 0x412 + ;; code offset: 0x408 (local.set $1 - ;; code offset: 0x410 + ;; code offset: 0x406 (call $malloc - ;; code offset: 0x40e + ;; code offset: 0x404 (local.tee $2 - ;; code offset: 0x40d + ;; code offset: 0x403 (i32.shl - ;; code offset: 0x409 + ;; code offset: 0x3ff (local.get $3) - ;; code offset: 0x40b + ;; code offset: 0x401 (i32.const 2) ) ) ) ) - ;; code offset: 0x418 + ;; code offset: 0x40e (local.set $5 - ;; code offset: 0x416 + ;; code offset: 0x40c (call $malloc - ;; code offset: 0x414 + ;; code offset: 0x40a (local.get $2) ) ) - ;; code offset: 0x41a + ;; code offset: 0x410 (block $block4 - ;; code offset: 0x41c + ;; code offset: 0x412 (block $block3 - ;; code offset: 0x41e + ;; code offset: 0x414 (block $block2 - ;; code offset: 0x425 + ;; code offset: 0x41b (if - ;; code offset: 0x424 + ;; code offset: 0x41a (i32.gt_s - ;; code offset: 0x420 + ;; code offset: 0x416 (local.get $3) - ;; code offset: 0x422 + ;; code offset: 0x418 (i32.const 0) ) (then - ;; code offset: 0x427 + ;; code offset: 0x41d (loop $label1 - ;; code offset: 0x433 + ;; code offset: 0x429 (i32.store - ;; code offset: 0x430 + ;; code offset: 0x426 (i32.add - ;; code offset: 0x429 + ;; code offset: 0x41f (local.get $1) - ;; code offset: 0x42f + ;; code offset: 0x425 (i32.shl - ;; code offset: 0x42b + ;; code offset: 0x421 (local.get $0) - ;; code offset: 0x42d + ;; code offset: 0x423 (i32.const 2) ) ) - ;; code offset: 0x431 + ;; code offset: 0x427 (local.get $0) ) - ;; code offset: 0x440 + ;; code offset: 0x436 (br_if $label1 - ;; code offset: 0x43f + ;; code offset: 0x435 (i32.ne - ;; code offset: 0x43b + ;; code offset: 0x431 (local.tee $0 - ;; code offset: 0x43a + ;; code offset: 0x430 (i32.add - ;; code offset: 0x436 + ;; code offset: 0x42c (local.get $0) - ;; code offset: 0x438 + ;; code offset: 0x42e (i32.const 1) ) ) - ;; code offset: 0x43d + ;; code offset: 0x433 (local.get $3) ) ) ) - ;; code offset: 0x445 + ;; code offset: 0x43b (local.set $6 - ;; code offset: 0x443 + ;; code offset: 0x439 (i32.const 30) ) - ;; code offset: 0x449 + ;; code offset: 0x43f (local.set $2 - ;; code offset: 0x447 + ;; code offset: 0x43d (local.get $3) ) - ;; code offset: 0x44b + ;; code offset: 0x441 (br $block2) ) ) - ;; code offset: 0x450 + ;; code offset: 0x446 (local.set $6 - ;; code offset: 0x44e + ;; code offset: 0x444 (i32.const 30) ) - ;; code offset: 0x454 + ;; code offset: 0x44a (local.set $2 - ;; code offset: 0x452 + ;; code offset: 0x448 (local.get $3) ) - ;; code offset: 0x456 + ;; code offset: 0x44c (br $block3) ) - ;; code offset: 0x459 + ;; code offset: 0x44f (loop $label6 - ;; code offset: 0x45d + ;; code offset: 0x453 (local.set $0 - ;; code offset: 0x45b + ;; code offset: 0x451 (i32.const 0) ) - ;; code offset: 0x45f + ;; code offset: 0x455 (loop $label2 - ;; code offset: 0x471 + ;; code offset: 0x467 (i32.store offset=16 - ;; code offset: 0x461 + ;; code offset: 0x457 (local.get $8) - ;; code offset: 0x470 + ;; code offset: 0x466 (i32.add - ;; code offset: 0x46b + ;; code offset: 0x461 (i32.load - ;; code offset: 0x46a + ;; code offset: 0x460 (i32.add - ;; code offset: 0x463 + ;; code offset: 0x459 (local.get $1) - ;; code offset: 0x469 + ;; code offset: 0x45f (i32.shl - ;; code offset: 0x465 + ;; code offset: 0x45b (local.get $0) - ;; code offset: 0x467 + ;; code offset: 0x45d (i32.const 2) ) ) ) - ;; code offset: 0x46e + ;; code offset: 0x464 (i32.const 1) ) ) - ;; code offset: 0x47e + ;; code offset: 0x474 (drop - ;; code offset: 0x47c + ;; code offset: 0x472 (call $iprintf - ;; code offset: 0x474 + ;; code offset: 0x46a (i32.const 1047) - ;; code offset: 0x47b + ;; code offset: 0x471 (i32.add - ;; code offset: 0x477 + ;; code offset: 0x46d (local.get $8) - ;; code offset: 0x479 + ;; code offset: 0x46f (i32.const 16) ) ) ) - ;; code offset: 0x489 + ;; code offset: 0x47f (br_if $label2 - ;; code offset: 0x488 + ;; code offset: 0x47e (i32.ne - ;; code offset: 0x484 + ;; code offset: 0x47a (local.tee $0 - ;; code offset: 0x483 + ;; code offset: 0x479 (i32.add - ;; code offset: 0x47f + ;; code offset: 0x475 (local.get $0) - ;; code offset: 0x481 + ;; code offset: 0x477 (i32.const 1) ) ) - ;; code offset: 0x486 + ;; code offset: 0x47c (local.get $3) ) ) ) - ;; code offset: 0x490 + ;; code offset: 0x486 (drop - ;; code offset: 0x48e + ;; code offset: 0x484 (call $putchar - ;; code offset: 0x48c + ;; code offset: 0x482 (i32.const 10) ) ) - ;; code offset: 0x496 + ;; code offset: 0x48c (if - ;; code offset: 0x495 + ;; code offset: 0x48b (i32.gt_s - ;; code offset: 0x491 + ;; code offset: 0x487 (local.get $2) - ;; code offset: 0x493 + ;; code offset: 0x489 (i32.const 1) ) (then - ;; code offset: 0x498 + ;; code offset: 0x48e (loop $label3 - ;; code offset: 0x4a9 + ;; code offset: 0x49f (i32.store - ;; code offset: 0x4a6 + ;; code offset: 0x49c (i32.add - ;; code offset: 0x49a + ;; code offset: 0x490 (local.get $5) - ;; code offset: 0x4a5 + ;; code offset: 0x49b (i32.shl - ;; code offset: 0x4a1 + ;; code offset: 0x497 (local.tee $0 - ;; code offset: 0x4a0 + ;; code offset: 0x496 (i32.sub - ;; code offset: 0x49c + ;; code offset: 0x492 (local.get $2) - ;; code offset: 0x49e + ;; code offset: 0x494 (i32.const 1) ) ) - ;; code offset: 0x4a3 + ;; code offset: 0x499 (i32.const 2) ) ) - ;; code offset: 0x4a7 + ;; code offset: 0x49d (local.get $2) ) - ;; code offset: 0x4b5 + ;; code offset: 0x4ab (br_if $label3 (block (result i32) (local.set $scratch - ;; code offset: 0x4b0 + ;; code offset: 0x4a6 (i32.gt_s - ;; code offset: 0x4ac + ;; code offset: 0x4a2 (local.get $2) - ;; code offset: 0x4ae + ;; code offset: 0x4a4 (i32.const 2) ) ) - ;; code offset: 0x4b3 + ;; code offset: 0x4a9 (local.set $2 - ;; code offset: 0x4b1 + ;; code offset: 0x4a7 (local.get $0) ) (local.get $scratch) @@ -6275,261 +6248,261 @@ file_names[ 4]: ) ) ) - ;; code offset: 0x4be + ;; code offset: 0x4b4 (br_if $block4 - ;; code offset: 0x4bd + ;; code offset: 0x4b3 (i32.eq - ;; code offset: 0x4b9 + ;; code offset: 0x4af (local.get $2) - ;; code offset: 0x4bb + ;; code offset: 0x4b1 (local.get $3) ) ) - ;; code offset: 0x4c5 + ;; code offset: 0x4bb (local.set $6 - ;; code offset: 0x4c4 + ;; code offset: 0x4ba (i32.sub - ;; code offset: 0x4c0 + ;; code offset: 0x4b6 (local.get $6) - ;; code offset: 0x4c2 + ;; code offset: 0x4b8 (i32.const 1) ) ) - ;; code offset: 0x4c7 + ;; code offset: 0x4bd (loop $label5 - ;; code offset: 0x4cb + ;; code offset: 0x4c1 (local.set $0 - ;; code offset: 0x4c9 + ;; code offset: 0x4bf (i32.const 0) ) - ;; code offset: 0x4d2 + ;; code offset: 0x4c8 (local.set $7 - ;; code offset: 0x4cf + ;; code offset: 0x4c5 (i32.load - ;; code offset: 0x4cd + ;; code offset: 0x4c3 (local.get $1) ) ) - ;; code offset: 0x4d9 + ;; code offset: 0x4cf (if - ;; code offset: 0x4d8 + ;; code offset: 0x4ce (i32.gt_s - ;; code offset: 0x4d4 + ;; code offset: 0x4ca (local.get $2) - ;; code offset: 0x4d6 + ;; code offset: 0x4cc (i32.const 0) ) (then - ;; code offset: 0x4db + ;; code offset: 0x4d1 (loop $label4 - ;; code offset: 0x4f5 + ;; code offset: 0x4eb (i32.store - ;; code offset: 0x4e4 + ;; code offset: 0x4da (i32.add - ;; code offset: 0x4dd + ;; code offset: 0x4d3 (local.get $1) - ;; code offset: 0x4e3 + ;; code offset: 0x4d9 (i32.shl - ;; code offset: 0x4df + ;; code offset: 0x4d5 (local.get $0) - ;; code offset: 0x4e1 + ;; code offset: 0x4d7 (i32.const 2) ) ) - ;; code offset: 0x4f2 + ;; code offset: 0x4e8 (i32.load - ;; code offset: 0x4f1 + ;; code offset: 0x4e7 (i32.add - ;; code offset: 0x4e5 + ;; code offset: 0x4db (local.get $1) - ;; code offset: 0x4f0 + ;; code offset: 0x4e6 (i32.shl - ;; code offset: 0x4ec + ;; code offset: 0x4e2 (local.tee $0 - ;; code offset: 0x4eb + ;; code offset: 0x4e1 (i32.add - ;; code offset: 0x4e7 + ;; code offset: 0x4dd (local.get $0) - ;; code offset: 0x4e9 + ;; code offset: 0x4df (i32.const 1) ) ) - ;; code offset: 0x4ee + ;; code offset: 0x4e4 (i32.const 2) ) ) ) ) - ;; code offset: 0x4fd + ;; code offset: 0x4f3 (br_if $label4 - ;; code offset: 0x4fc + ;; code offset: 0x4f2 (i32.ne - ;; code offset: 0x4f8 + ;; code offset: 0x4ee (local.get $0) - ;; code offset: 0x4fa + ;; code offset: 0x4f0 (local.get $2) ) ) ) - ;; code offset: 0x502 + ;; code offset: 0x4f8 (local.set $0 - ;; code offset: 0x500 + ;; code offset: 0x4f6 (local.get $2) ) ) ) - ;; code offset: 0x50f + ;; code offset: 0x505 (i32.store - ;; code offset: 0x50c + ;; code offset: 0x502 (i32.add - ;; code offset: 0x505 + ;; code offset: 0x4fb (local.get $1) - ;; code offset: 0x50b + ;; code offset: 0x501 (i32.shl - ;; code offset: 0x507 + ;; code offset: 0x4fd (local.get $0) - ;; code offset: 0x509 + ;; code offset: 0x4ff (i32.const 2) ) ) - ;; code offset: 0x50d + ;; code offset: 0x503 (local.get $7) ) - ;; code offset: 0x526 + ;; code offset: 0x51c (i32.store - ;; code offset: 0x51a + ;; code offset: 0x510 (local.tee $0 - ;; code offset: 0x519 + ;; code offset: 0x50f (i32.add - ;; code offset: 0x512 + ;; code offset: 0x508 (local.get $5) - ;; code offset: 0x518 + ;; code offset: 0x50e (i32.shl - ;; code offset: 0x514 + ;; code offset: 0x50a (local.get $2) - ;; code offset: 0x516 + ;; code offset: 0x50c (i32.const 2) ) ) ) - ;; code offset: 0x525 + ;; code offset: 0x51b (i32.sub - ;; code offset: 0x521 + ;; code offset: 0x517 (local.tee $0 - ;; code offset: 0x51e + ;; code offset: 0x514 (i32.load - ;; code offset: 0x51c + ;; code offset: 0x512 (local.get $0) ) ) - ;; code offset: 0x523 + ;; code offset: 0x519 (i32.const 1) ) ) - ;; code offset: 0x52e + ;; code offset: 0x524 (if - ;; code offset: 0x52d + ;; code offset: 0x523 (i32.le_s - ;; code offset: 0x529 + ;; code offset: 0x51f (local.get $0) - ;; code offset: 0x52b + ;; code offset: 0x521 (i32.const 1) ) (then - ;; code offset: 0x53a + ;; code offset: 0x530 (br_if $label5 - ;; code offset: 0x539 + ;; code offset: 0x52f (i32.ne - ;; code offset: 0x535 + ;; code offset: 0x52b (local.tee $2 - ;; code offset: 0x534 + ;; code offset: 0x52a (i32.add - ;; code offset: 0x530 + ;; code offset: 0x526 (local.get $2) - ;; code offset: 0x532 + ;; code offset: 0x528 (i32.const 1) ) ) - ;; code offset: 0x537 + ;; code offset: 0x52d (local.get $3) ) ) - ;; code offset: 0x53c + ;; code offset: 0x532 (br $block4) ) ) ) - ;; code offset: 0x542 + ;; code offset: 0x538 (br_if $label6 - ;; code offset: 0x540 + ;; code offset: 0x536 (local.get $6) ) ) - ;; code offset: 0x545 + ;; code offset: 0x53b (br $block4) ) - ;; code offset: 0x548 + ;; code offset: 0x53e (loop $label10 - ;; code offset: 0x54e + ;; code offset: 0x544 (drop - ;; code offset: 0x54c + ;; code offset: 0x542 (call $putchar - ;; code offset: 0x54a + ;; code offset: 0x540 (i32.const 10) ) ) - ;; code offset: 0x554 + ;; code offset: 0x54a (if - ;; code offset: 0x553 + ;; code offset: 0x549 (i32.gt_s - ;; code offset: 0x54f + ;; code offset: 0x545 (local.get $2) - ;; code offset: 0x551 + ;; code offset: 0x547 (i32.const 1) ) (then - ;; code offset: 0x556 + ;; code offset: 0x54c (loop $label7 - ;; code offset: 0x567 + ;; code offset: 0x55d (i32.store - ;; code offset: 0x564 + ;; code offset: 0x55a (i32.add - ;; code offset: 0x558 + ;; code offset: 0x54e (local.get $5) - ;; code offset: 0x563 + ;; code offset: 0x559 (i32.shl - ;; code offset: 0x55f + ;; code offset: 0x555 (local.tee $0 - ;; code offset: 0x55e + ;; code offset: 0x554 (i32.sub - ;; code offset: 0x55a + ;; code offset: 0x550 (local.get $2) - ;; code offset: 0x55c + ;; code offset: 0x552 (i32.const 1) ) ) - ;; code offset: 0x561 + ;; code offset: 0x557 (i32.const 2) ) ) - ;; code offset: 0x565 + ;; code offset: 0x55b (local.get $2) ) - ;; code offset: 0x573 + ;; code offset: 0x569 (br_if $label7 (block (result i32) (local.set $scratch_10 - ;; code offset: 0x56e + ;; code offset: 0x564 (i32.gt_s - ;; code offset: 0x56a + ;; code offset: 0x560 (local.get $2) - ;; code offset: 0x56c + ;; code offset: 0x562 (i32.const 2) ) ) - ;; code offset: 0x571 + ;; code offset: 0x567 (local.set $2 - ;; code offset: 0x56f + ;; code offset: 0x565 (local.get $0) ) (local.get $scratch_10) @@ -6538,318 +6511,318 @@ file_names[ 4]: ) ) ) - ;; code offset: 0x57c + ;; code offset: 0x572 (br_if $block4 - ;; code offset: 0x57b + ;; code offset: 0x571 (i32.eq - ;; code offset: 0x577 + ;; code offset: 0x56d (local.get $2) - ;; code offset: 0x579 + ;; code offset: 0x56f (local.get $3) ) ) - ;; code offset: 0x583 + ;; code offset: 0x579 (local.set $6 - ;; code offset: 0x582 + ;; code offset: 0x578 (i32.sub - ;; code offset: 0x57e + ;; code offset: 0x574 (local.get $6) - ;; code offset: 0x580 + ;; code offset: 0x576 (i32.const 1) ) ) - ;; code offset: 0x585 + ;; code offset: 0x57b (loop $label9 - ;; code offset: 0x58c + ;; code offset: 0x582 (local.set $7 - ;; code offset: 0x589 + ;; code offset: 0x57f (i32.load - ;; code offset: 0x587 + ;; code offset: 0x57d (local.get $1) ) ) - ;; code offset: 0x590 + ;; code offset: 0x586 (local.set $0 - ;; code offset: 0x58e + ;; code offset: 0x584 (i32.const 0) ) - ;; code offset: 0x597 + ;; code offset: 0x58d (if - ;; code offset: 0x596 + ;; code offset: 0x58c (i32.gt_s - ;; code offset: 0x592 + ;; code offset: 0x588 (local.get $2) - ;; code offset: 0x594 + ;; code offset: 0x58a (i32.const 0) ) (then - ;; code offset: 0x599 + ;; code offset: 0x58f (loop $label8 - ;; code offset: 0x5b3 + ;; code offset: 0x5a9 (i32.store - ;; code offset: 0x5a2 + ;; code offset: 0x598 (i32.add - ;; code offset: 0x59b + ;; code offset: 0x591 (local.get $1) - ;; code offset: 0x5a1 + ;; code offset: 0x597 (i32.shl - ;; code offset: 0x59d + ;; code offset: 0x593 (local.get $0) - ;; code offset: 0x59f + ;; code offset: 0x595 (i32.const 2) ) ) - ;; code offset: 0x5b0 + ;; code offset: 0x5a6 (i32.load - ;; code offset: 0x5af + ;; code offset: 0x5a5 (i32.add - ;; code offset: 0x5a3 + ;; code offset: 0x599 (local.get $1) - ;; code offset: 0x5ae + ;; code offset: 0x5a4 (i32.shl - ;; code offset: 0x5aa + ;; code offset: 0x5a0 (local.tee $0 - ;; code offset: 0x5a9 + ;; code offset: 0x59f (i32.add - ;; code offset: 0x5a5 + ;; code offset: 0x59b (local.get $0) - ;; code offset: 0x5a7 + ;; code offset: 0x59d (i32.const 1) ) ) - ;; code offset: 0x5ac + ;; code offset: 0x5a2 (i32.const 2) ) ) ) ) - ;; code offset: 0x5bb + ;; code offset: 0x5b1 (br_if $label8 - ;; code offset: 0x5ba + ;; code offset: 0x5b0 (i32.ne - ;; code offset: 0x5b6 + ;; code offset: 0x5ac (local.get $0) - ;; code offset: 0x5b8 + ;; code offset: 0x5ae (local.get $2) ) ) ) - ;; code offset: 0x5c0 + ;; code offset: 0x5b6 (local.set $0 - ;; code offset: 0x5be + ;; code offset: 0x5b4 (local.get $2) ) ) ) - ;; code offset: 0x5cd + ;; code offset: 0x5c3 (i32.store - ;; code offset: 0x5ca + ;; code offset: 0x5c0 (i32.add - ;; code offset: 0x5c3 + ;; code offset: 0x5b9 (local.get $1) - ;; code offset: 0x5c9 + ;; code offset: 0x5bf (i32.shl - ;; code offset: 0x5c5 + ;; code offset: 0x5bb (local.get $0) - ;; code offset: 0x5c7 + ;; code offset: 0x5bd (i32.const 2) ) ) - ;; code offset: 0x5cb + ;; code offset: 0x5c1 (local.get $7) ) - ;; code offset: 0x5e4 + ;; code offset: 0x5da (i32.store - ;; code offset: 0x5d8 + ;; code offset: 0x5ce (local.tee $0 - ;; code offset: 0x5d7 + ;; code offset: 0x5cd (i32.add - ;; code offset: 0x5d0 + ;; code offset: 0x5c6 (local.get $5) - ;; code offset: 0x5d6 + ;; code offset: 0x5cc (i32.shl - ;; code offset: 0x5d2 + ;; code offset: 0x5c8 (local.get $2) - ;; code offset: 0x5d4 + ;; code offset: 0x5ca (i32.const 2) ) ) ) - ;; code offset: 0x5e3 + ;; code offset: 0x5d9 (i32.sub - ;; code offset: 0x5df + ;; code offset: 0x5d5 (local.tee $0 - ;; code offset: 0x5dc + ;; code offset: 0x5d2 (i32.load - ;; code offset: 0x5da + ;; code offset: 0x5d0 (local.get $0) ) ) - ;; code offset: 0x5e1 + ;; code offset: 0x5d7 (i32.const 1) ) ) - ;; code offset: 0x5ec + ;; code offset: 0x5e2 (if - ;; code offset: 0x5eb + ;; code offset: 0x5e1 (i32.le_s - ;; code offset: 0x5e7 + ;; code offset: 0x5dd (local.get $0) - ;; code offset: 0x5e9 + ;; code offset: 0x5df (i32.const 1) ) (then - ;; code offset: 0x5f8 + ;; code offset: 0x5ee (br_if $label9 - ;; code offset: 0x5f7 + ;; code offset: 0x5ed (i32.ne - ;; code offset: 0x5f3 + ;; code offset: 0x5e9 (local.tee $2 - ;; code offset: 0x5f2 + ;; code offset: 0x5e8 (i32.add - ;; code offset: 0x5ee + ;; code offset: 0x5e4 (local.get $2) - ;; code offset: 0x5f0 + ;; code offset: 0x5e6 (i32.const 1) ) ) - ;; code offset: 0x5f5 + ;; code offset: 0x5eb (local.get $3) ) ) - ;; code offset: 0x5fa + ;; code offset: 0x5f0 (br $block4) ) ) ) - ;; code offset: 0x600 + ;; code offset: 0x5f6 (br_if $label10 - ;; code offset: 0x5fe + ;; code offset: 0x5f4 (local.get $6) ) ) ) - ;; code offset: 0x606 + ;; code offset: 0x5fc (call $free - ;; code offset: 0x604 + ;; code offset: 0x5fa (local.get $1) ) - ;; code offset: 0x60a + ;; code offset: 0x600 (call $free - ;; code offset: 0x608 + ;; code offset: 0x5fe (local.get $5) ) - ;; code offset: 0x60e + ;; code offset: 0x604 (local.set $5 - ;; code offset: 0x60c + ;; code offset: 0x602 (i32.const 0) ) - ;; code offset: 0x612 + ;; code offset: 0x608 (local.set $0 - ;; code offset: 0x610 + ;; code offset: 0x606 (i32.const 0) ) - ;; code offset: 0x616 + ;; code offset: 0x60c (if - ;; code offset: 0x614 + ;; code offset: 0x60a (local.get $4) (then - ;; code offset: 0x618 + ;; code offset: 0x60e (loop $label11 - ;; code offset: 0x61e + ;; code offset: 0x614 (local.set $1 - ;; code offset: 0x61c + ;; code offset: 0x612 (call $"fannkuch_worker(void*)" - ;; code offset: 0x61a + ;; code offset: 0x610 (local.get $4) ) ) - ;; code offset: 0x625 + ;; code offset: 0x61b (local.set $2 - ;; code offset: 0x622 + ;; code offset: 0x618 (i32.load offset=8 - ;; code offset: 0x620 + ;; code offset: 0x616 (local.get $4) ) ) - ;; code offset: 0x629 + ;; code offset: 0x61f (call $free - ;; code offset: 0x627 + ;; code offset: 0x61d (local.get $4) ) - ;; code offset: 0x635 + ;; code offset: 0x62b (local.set $0 - ;; code offset: 0x634 + ;; code offset: 0x62a (select - ;; code offset: 0x62b + ;; code offset: 0x621 (local.get $1) - ;; code offset: 0x62d + ;; code offset: 0x623 (local.get $0) - ;; code offset: 0x633 + ;; code offset: 0x629 (i32.lt_s - ;; code offset: 0x62f + ;; code offset: 0x625 (local.get $0) - ;; code offset: 0x631 + ;; code offset: 0x627 (local.get $1) ) ) ) - ;; code offset: 0x639 + ;; code offset: 0x62f (local.set $4 - ;; code offset: 0x637 + ;; code offset: 0x62d (local.get $2) ) - ;; code offset: 0x63d + ;; code offset: 0x633 (br_if $label11 - ;; code offset: 0x63b + ;; code offset: 0x631 (local.get $2) ) ) ) ) - ;; code offset: 0x645 + ;; code offset: 0x63b (i32.store offset=4 - ;; code offset: 0x641 + ;; code offset: 0x637 (local.get $8) - ;; code offset: 0x643 + ;; code offset: 0x639 (local.get $0) ) - ;; code offset: 0x64c + ;; code offset: 0x642 (i32.store - ;; code offset: 0x648 + ;; code offset: 0x63e (local.get $8) - ;; code offset: 0x64a + ;; code offset: 0x640 (local.get $3) ) - ;; code offset: 0x656 + ;; code offset: 0x64c (drop - ;; code offset: 0x654 + ;; code offset: 0x64a (call $iprintf - ;; code offset: 0x64f + ;; code offset: 0x645 (i32.const 1024) - ;; code offset: 0x652 + ;; code offset: 0x648 (local.get $8) ) ) ) - ;; code offset: 0x65d + ;; code offset: 0x653 (global.set $global$0 - ;; code offset: 0x65c + ;; code offset: 0x652 (i32.add - ;; code offset: 0x658 + ;; code offset: 0x64e (local.get $8) - ;; code offset: 0x65a + ;; code offset: 0x650 (i32.const 32) ) ) - ;; code offset: 0x65f + ;; code offset: 0x655 (local.get $5) ) ;; custom section ".debug_info", size 851 ;; custom section ".debug_loc", size 1073 ;; custom section ".debug_ranges", size 88 ;; custom section ".debug_abbrev", size 333 - ;; custom section ".debug_line", size 2642 + ;; custom section ".debug_line", size 2618 ;; custom section ".debug_str", size 434 ;; custom section "producers", size 135 ) From c5deeeb57f9a6ebc151a556ee88566ebd6e78498 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 15 Jul 2026 10:10:28 -0700 Subject: [PATCH 05/93] moar --- src/passes/pass.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp index 64a673db464..77f1020af2a 100644 --- a/src/passes/pass.cpp +++ b/src/passes/pass.cpp @@ -738,10 +738,9 @@ void PassRunner::addDefaultFunctionOptimizationPasses() { addIfNoDWARFIssues( "remove-unused-names"); // remove-unused-brs opens opportunities addIfNoDWARFIssues("merge-blocks"); // clean up remove-unused-brs new blocks - // late propagation (and, optionally, constraint analysis which can generate - // more constants to propagate) + addIfNoDWARFIssues("constraint-analysis"); // TODO only -O3 -Oz? + // late propagation if (options.optimizeLevel >= 3 || options.shrinkLevel >= 2) { - addIfNoDWARFIssues("constraint-analysis"); addIfNoDWARFIssues("precompute-propagate"); } else { addIfNoDWARFIssues("precompute"); From e83c054efbd81ca354b836a56b4b76d2791087eb Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 31 Jul 2026 15:33:51 -0700 Subject: [PATCH 06/93] work --- scripts/fuzz_opt.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/scripts/fuzz_opt.py b/scripts/fuzz_opt.py index 9536be8fd66..5f10d64187b 100755 --- a/scripts/fuzz_opt.py +++ b/scripts/fuzz_opt.py @@ -2694,14 +2694,13 @@ def write_commands(commands, filename): ("--constraint-analysis",), ("--constraint-analysis",), ("--constraint-analysis",), - ("--constraint-analysis",), - ("--constraint-analysis",), - ("--constraint-analysis",), - ("--constraint-analysis",), - ("--constraint-analysis",), - ("--constraint-analysis",), - ("--constraint-analysis",), - ("--constraint-analysis",), + ("--constraint-analysis-loops",), + ("--constraint-analysis-loops",), + ("--constraint-analysis-loops",), + ("--constraint-analysis-loops",), + ("--constraint-analysis-loops",), + ("--constraint-analysis-loops",), + ("--constraint-analysis-loops",), ("--dae",), ("--dae-optimizing",), ("--dae2",), From 192d924a5b4e2d9b8b3fb5f2434cd1984b8de21f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 31 Jul 2026 15:34:36 -0700 Subject: [PATCH 07/93] work --- src/passes/pass.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp index f415969aa56..f65d99e3b15 100644 --- a/src/passes/pass.cpp +++ b/src/passes/pass.cpp @@ -741,7 +741,7 @@ void PassRunner::addDefaultFunctionOptimizationPasses() { addIfNoDWARFIssues( "remove-unused-names"); // remove-unused-brs opens opportunities addIfNoDWARFIssues("merge-blocks"); // clean up remove-unused-brs new blocks - addIfNoDWARFIssues("constraint-analysis"); // TODO only -O3 -Oz? + addIfNoDWARFIssues("constraint-analysis-loops"); // TODO only -O3 -Oz? // late propagation if (options.optimizeLevel >= 3 || options.shrinkLevel >= 2) { addIfNoDWARFIssues("precompute-propagate"); From 3096b527ad3dc8b6d792038eb6bafdf06ff4148b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 7 Aug 2026 11:29:58 -0700 Subject: [PATCH 08/93] less --- scripts/fuzz_opt.py | 7 ------- src/passes/pass.cpp | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/scripts/fuzz_opt.py b/scripts/fuzz_opt.py index 5f10d64187b..1334733992a 100755 --- a/scripts/fuzz_opt.py +++ b/scripts/fuzz_opt.py @@ -2694,13 +2694,6 @@ def write_commands(commands, filename): ("--constraint-analysis",), ("--constraint-analysis",), ("--constraint-analysis",), - ("--constraint-analysis-loops",), - ("--constraint-analysis-loops",), - ("--constraint-analysis-loops",), - ("--constraint-analysis-loops",), - ("--constraint-analysis-loops",), - ("--constraint-analysis-loops",), - ("--constraint-analysis-loops",), ("--dae",), ("--dae-optimizing",), ("--dae2",), diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp index f65d99e3b15..f415969aa56 100644 --- a/src/passes/pass.cpp +++ b/src/passes/pass.cpp @@ -741,7 +741,7 @@ void PassRunner::addDefaultFunctionOptimizationPasses() { addIfNoDWARFIssues( "remove-unused-names"); // remove-unused-brs opens opportunities addIfNoDWARFIssues("merge-blocks"); // clean up remove-unused-brs new blocks - addIfNoDWARFIssues("constraint-analysis-loops"); // TODO only -O3 -Oz? + addIfNoDWARFIssues("constraint-analysis"); // TODO only -O3 -Oz? // late propagation if (options.optimizeLevel >= 3 || options.shrinkLevel >= 2) { addIfNoDWARFIssues("precompute-propagate"); From df548b93fb0eb5452315c34c3a8008a5af15f275 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 12 Aug 2026 13:27:56 -0700 Subject: [PATCH 09/93] fix --- src/passes/ConstraintAnalysis.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/passes/ConstraintAnalysis.cpp b/src/passes/ConstraintAnalysis.cpp index 95e01c18094..d075db9c457 100644 --- a/src/passes/ConstraintAnalysis.cpp +++ b/src/passes/ConstraintAnalysis.cpp @@ -510,9 +510,10 @@ struct ConstraintAnalysis // when it reaches the loop bound, which may be very high. We don't want to // spend significant time on such constant operations, as other passes will // propagate them anyhow, so we verify that we don't apply such x = y + 1 - // operations too many times. + // operations a ridiculous number of times (enough that it suggests we are + // in that bad situation where we increment until an integer overflow). #ifndef NDEBUG - static const Index MaxBinaryActions = 5; + static const Index MaxBinaryActions = 1024 * 1024; // How many times we processed each Binary action. std::unordered_map binaryActionCounts; From cfc644f1f7f56eccbca9116812f8817725c74fc8 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 14 Aug 2026 16:18:37 -0700 Subject: [PATCH 10/93] finish --- scripts/fuzz_opt.py | 6 ------ src/passes/pass.cpp | 4 +++- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/scripts/fuzz_opt.py b/scripts/fuzz_opt.py index ee50d86800d..ffc4700a2db 100755 --- a/scripts/fuzz_opt.py +++ b/scripts/fuzz_opt.py @@ -2692,12 +2692,6 @@ def write_commands(commands, filename): ("--code-folding",), ("--const-hoisting",), ("--constraint-analysis",), - ("--constraint-analysis",), - ("--constraint-analysis",), - ("--constraint-analysis",), - ("--constraint-analysis",), - ("--constraint-analysis",), - ("--constraint-analysis",), ("--dae",), ("--dae-optimizing",), ("--dae2",), diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp index f415969aa56..7331515c726 100644 --- a/src/passes/pass.cpp +++ b/src/passes/pass.cpp @@ -741,7 +741,9 @@ void PassRunner::addDefaultFunctionOptimizationPasses() { addIfNoDWARFIssues( "remove-unused-names"); // remove-unused-brs opens opportunities addIfNoDWARFIssues("merge-blocks"); // clean up remove-unused-brs new blocks - addIfNoDWARFIssues("constraint-analysis"); // TODO only -O3 -Oz? + if (options.optimizeLevel >= 3 || options.shrinkLevel >= 1) { + addIfNoDWARFIssues("constraint-analysis"); + } // late propagation if (options.optimizeLevel >= 3 || options.shrinkLevel >= 2) { addIfNoDWARFIssues("precompute-propagate"); From 9cdfcbe3c9eabb633ba27e845fe61848228626cd Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 14 Aug 2026 16:21:14 -0700 Subject: [PATCH 11/93] work --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b28dee98d3..b73da6c5af3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,9 @@ full changeset diff at the end of each section. Current Trunk ------------- +- Add a new `--constraint-analysis` pass which propagates logical facts along + branches. + v132 ---- From 433559a78724572e981678427dada12d3727f2e9 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 17 Aug 2026 13:45:10 -0700 Subject: [PATCH 12/93] move --- src/passes/pass.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp index 7331515c726..970e3fddfb5 100644 --- a/src/passes/pass.cpp +++ b/src/passes/pass.cpp @@ -740,10 +740,10 @@ void PassRunner::addDefaultFunctionOptimizationPasses() { "remove-unused-brs"); // coalesce-locals opens opportunities addIfNoDWARFIssues( "remove-unused-names"); // remove-unused-brs opens opportunities - addIfNoDWARFIssues("merge-blocks"); // clean up remove-unused-brs new blocks if (options.optimizeLevel >= 3 || options.shrinkLevel >= 1) { addIfNoDWARFIssues("constraint-analysis"); } + addIfNoDWARFIssues("merge-blocks"); // clean up new blocks from last passes // late propagation if (options.optimizeLevel >= 3 || options.shrinkLevel >= 2) { addIfNoDWARFIssues("precompute-propagate"); From e0832722e67fc9742a33b50bab8bb4143fff0e11 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 17 Aug 2026 13:51:41 -0700 Subject: [PATCH 13/93] update --- test/passes/fannkuch3_manyopts_dwarf.bin.txt | 4133 +++++++++--------- 1 file changed, 2053 insertions(+), 2080 deletions(-) diff --git a/test/passes/fannkuch3_manyopts_dwarf.bin.txt b/test/passes/fannkuch3_manyopts_dwarf.bin.txt index 98d1c7bb8e9..0d79097a275 100644 --- a/test/passes/fannkuch3_manyopts_dwarf.bin.txt +++ b/test/passes/fannkuch3_manyopts_dwarf.bin.txt @@ -2303,7 +2303,7 @@ Contains section .debug_info (851 bytes) Contains section .debug_loc (1073 bytes) Contains section .debug_ranges (88 bytes) Contains section .debug_abbrev (333 bytes) -Contains section .debug_line (2642 bytes) +Contains section .debug_line (2618 bytes) Contains section .debug_str (434 bytes) .debug_abbrev contents: @@ -2469,8 +2469,8 @@ Abbrev table for offset: 0x00000000 DW_AT_comp_dir [DW_FORM_strp] ( .debug_str[0x000000a9] = "/usr/local/google/home/azakai/Dev/2-binaryen") DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) DW_AT_ranges [DW_FORM_sec_offset] (0x00000040 - [0x00000006, 0x00000381) - [0x00000383, 0x00000662)) + [0x00000006, 0x00000377) + [0x00000379, 0x00000658)) 0x00000026: DW_TAG_pointer_type [2] DW_AT_type [DW_FORM_ref4] (cu + 0x002b => {0x0000002b} "worker_args") @@ -2534,7 +2534,7 @@ Abbrev table for offset: 0x00000000 0x00000082: DW_TAG_subprogram [10] * DW_AT_low_pc [DW_FORM_addr] (0x0000000000000006) - DW_AT_high_pc [DW_FORM_data4] (0x0000037b) + DW_AT_high_pc [DW_FORM_data4] (0x00000371) DW_AT_frame_base [DW_FORM_exprloc] (DW_OP_WASM_location 0x1 +0, DW_OP_stack_value) DW_AT_GNU_all_call_sites [DW_FORM_flag_present] (true) DW_AT_linkage_name [DW_FORM_strp] ( .debug_str[0x00000166] = "_Z15fannkuch_workerPv") @@ -2569,13 +2569,13 @@ Abbrev table for offset: 0x00000000 DW_AT_location [DW_FORM_sec_offset] (0x0000001d: [0xffffffff, 0x00000027): [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value - [0x0000003d, 0x00000042): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value + [0x0000003b, 0x00000040): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +1, DW_OP_stack_value - [0x0000010c, 0x00000116): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value + [0x00000103, 0x0000010d): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value - [0x00000235, 0x00000240): DW_OP_consts +0, DW_OP_stack_value + [0x0000022b, 0x00000236): DW_OP_consts +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +1, DW_OP_stack_value - [0x00000289, 0x00000293): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value + [0x0000027f, 0x00000289): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value) DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000d6] = "i") DW_AT_decl_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") @@ -2620,9 +2620,9 @@ Abbrev table for offset: 0x00000000 0x0000010e: DW_TAG_variable [13] DW_AT_location [DW_FORM_sec_offset] (0x0000011d: - [0xffffffff, 0x000001e2): + [0xffffffff, 0x000001d9): [0x00000000, 0x00000005): DW_OP_WASM_location 0x0 +2, DW_OP_stack_value - [0x0000017d, 0x00000182): DW_OP_WASM_location 0x0 +2, DW_OP_stack_value) + [0x0000017c, 0x00000181): DW_OP_WASM_location 0x0 +2, DW_OP_stack_value) DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000014a] = "r") DW_AT_decl_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") DW_AT_decl_line [DW_FORM_data1] (30) @@ -2630,13 +2630,13 @@ Abbrev table for offset: 0x00000000 0x0000011d: DW_TAG_variable [13] DW_AT_location [DW_FORM_sec_offset] (0x00000149: - [0xffffffff, 0x000000d7): + [0xffffffff, 0x000000ce): [0x00000000, 0x00000013): DW_OP_consts +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +13, DW_OP_stack_value [0x00000085, 0x0000008d): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value - [0x00000185, 0x00000190): DW_OP_consts +0, DW_OP_stack_value + [0x00000184, 0x0000018f): DW_OP_consts +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +10, DW_OP_stack_value - [0x00000202, 0x0000020a): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value) + [0x00000201, 0x00000209): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value) DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000155] = "flips") DW_AT_decl_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") DW_AT_decl_line [DW_FORM_data1] (30) @@ -2644,9 +2644,9 @@ Abbrev table for offset: 0x00000000 0x0000012c: DW_TAG_variable [13] DW_AT_location [DW_FORM_sec_offset] (0x000001ab: - [0xffffffff, 0x000000e6): + [0xffffffff, 0x000000dd): [0x00000000, 0x00000004): DW_OP_WASM_location 0x0 +12, DW_OP_stack_value - [0x0000017d, 0x00000181): DW_OP_WASM_location 0x0 +16, DW_OP_stack_value) + [0x0000017c, 0x00000180): DW_OP_WASM_location 0x0 +16, DW_OP_stack_value) DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000019b] = "k") DW_AT_decl_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") DW_AT_decl_line [DW_FORM_data1] (30) @@ -2654,11 +2654,11 @@ Abbrev table for offset: 0x00000000 0x0000013b: DW_TAG_variable [13] DW_AT_location [DW_FORM_sec_offset] (0x000001d7: - [0xffffffff, 0x000000fe): + [0xffffffff, 0x000000f5): [0x00000000, 0x00000004): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value [0x0000003c, 0x0000003f): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value - [0x0000017d, 0x00000181): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value - [0x000001b9, 0x000001bc): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value) + [0x0000017c, 0x00000180): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value + [0x000001b8, 0x000001bb): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value) DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000019d] = "j") DW_AT_decl_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") DW_AT_decl_line [DW_FORM_data1] (30) @@ -2666,11 +2666,11 @@ Abbrev table for offset: 0x00000000 0x0000014a: DW_TAG_variable [13] DW_AT_location [DW_FORM_sec_offset] (0x0000021f: - [0xffffffff, 0x00000113): + [0xffffffff, 0x0000010a): [0x00000000, 0x0000002a): DW_OP_WASM_location 0x0 +15, DW_OP_stack_value [0x0000003b, 0x00000051): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value - [0x0000017d, 0x000001a7): DW_OP_WASM_location 0x0 +14, DW_OP_stack_value - [0x000001b8, 0x000001ce): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value) + [0x0000017c, 0x000001a6): DW_OP_WASM_location 0x0 +14, DW_OP_stack_value + [0x000001b7, 0x000001cd): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value) DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000019f] = "tmp") DW_AT_decl_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") DW_AT_decl_line [DW_FORM_data1] (30) @@ -2678,10 +2678,10 @@ Abbrev table for offset: 0x00000000 0x00000159: DW_TAG_lexical_block [14] * DW_AT_ranges [DW_FORM_sec_offset] (0x00000000 - [0x0000017f, 0x000001bd) - [0x000001e7, 0x000001f0) - [0x000002fc, 0x0000033a) - [0x00000364, 0x0000036d)) + [0x00000176, 0x000001b4) + [0x000001de, 0x000001e7) + [0x000002f2, 0x00000330) + [0x0000035a, 0x00000363)) 0x0000015e: DW_TAG_variable [12] DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000163] = "p0") @@ -2701,19 +2701,19 @@ Abbrev table for offset: 0x00000000 DW_AT_low_pc [DW_FORM_addr] (0x0000000000000041) 0x00000179: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x00000000000000df) + DW_AT_low_pc [DW_FORM_addr] (0x00000000000000d6) 0x0000017e: DW_TAG_GNU_call_site [16] DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x019a => {0x0000019a} "free") - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000376) + DW_AT_low_pc [DW_FORM_addr] (0x000000000000036c) 0x00000187: DW_TAG_GNU_call_site [16] DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x019a => {0x0000019a} "free") - DW_AT_low_pc [DW_FORM_addr] (0x000000000000037a) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000370) 0x00000190: DW_TAG_GNU_call_site [16] DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x019a => {0x0000019a} "free") - DW_AT_low_pc [DW_FORM_addr] (0x000000000000037e) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000374) 0x00000199: NULL @@ -2817,7 +2817,7 @@ Abbrev table for offset: 0x00000000 0x0000023a: NULL 0x0000023b: DW_TAG_subprogram [23] * - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000383) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000379) DW_AT_high_pc [DW_FORM_data4] (0x000002df) DW_AT_frame_base [DW_FORM_exprloc] (DW_OP_WASM_location 0x0 +2, DW_OP_stack_value) DW_AT_GNU_all_call_sites [DW_FORM_flag_present] (true) @@ -2841,7 +2841,7 @@ Abbrev table for offset: 0x00000000 0x00000269: DW_TAG_variable [13] DW_AT_location [DW_FORM_sec_offset] (0x00000267: - [0xffffffff, 0x000003af): + [0xffffffff, 0x000003a5): [0x00000000, 0x00000005): DW_OP_WASM_location 0x0 +4, DW_OP_stack_value) DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000dc] = "n") DW_AT_decl_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") @@ -2850,8 +2850,8 @@ Abbrev table for offset: 0x00000000 0x00000278: DW_TAG_inlined_subroutine [24] * DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x01a8 => {0x000001a8} "_ZL8fannkuchi") - DW_AT_low_pc [DW_FORM_addr] (0x00000000000003c2) - DW_AT_high_pc [DW_FORM_data4] (0xfffffc3e) + DW_AT_low_pc [DW_FORM_addr] (0x00000000000003b8) + DW_AT_high_pc [DW_FORM_data4] (0xfffffc48) DW_AT_call_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") DW_AT_call_line [DW_FORM_data1] (159) DW_AT_call_column [DW_FORM_data1] (0x29) @@ -2867,14 +2867,14 @@ Abbrev table for offset: 0x00000000 0x00000296: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x000002a2: - [0xffffffff, 0x00000627): + [0xffffffff, 0x0000061d): [0x00000001, 0x00000001): DW_OP_lit0, DW_OP_stack_value [0x00000000, 0x00000018): DW_OP_WASM_location 0x0 +6, DW_OP_stack_value) DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x01ce => {0x000001ce} "args") 0x0000029f: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x000002cc: - [0xffffffff, 0x000003fe): + [0xffffffff, 0x000003f4): [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value [0x00000000, 0x00000005): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value @@ -2891,48 +2891,48 @@ Abbrev table for offset: 0x00000000 0x000002ad: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x00000354: - [0xffffffff, 0x00000414): + [0xffffffff, 0x0000040a): [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value) DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x01ef => {0x000001ef} "perm1") 0x000002b6: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x00000372: - [0xffffffff, 0x0000041a): + [0xffffffff, 0x00000410): [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +5, DW_OP_stack_value) DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x01fa => {0x000001fa} "count") 0x000002bf: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x00000390: - [0xffffffff, 0x00000537): + [0xffffffff, 0x0000052d): [0x00000000, 0x00000007): DW_OP_WASM_location 0x0 +6, DW_OP_stack_value [0x000000be, 0x000000c5): DW_OP_WASM_location 0x0 +6, DW_OP_stack_value) DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x0205 => {0x00000205} "r") 0x000002c8: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x000003e8: - [0xffffffff, 0x00000610): + [0xffffffff, 0x00000606): [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value [0x00000027, 0x0000002f): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value) DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x0210 => {0x00000210} "maxflips") 0x000002d1: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x00000413: - [0xffffffff, 0x00000620): + [0xffffffff, 0x00000616): [0x00000000, 0x0000001f): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value) DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x021b => {0x0000021b} "flips") 0x000002da: DW_TAG_label [28] DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x0226 => {0x00000226} "cleanup") - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000604) + DW_AT_low_pc [DW_FORM_addr] (0x00000000000005fa) 0x000002e3: DW_TAG_lexical_block [14] * DW_AT_ranges [DW_FORM_sec_offset] (0x00000028 - [0x000004cd, 0x00000512) - [0x00000585, 0x000005d0)) + [0x000004c3, 0x00000508) + [0x0000057b, 0x000005c6)) 0x000002e8: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x000003bc: - [0xffffffff, 0x0000058e): + [0xffffffff, 0x00000584): [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +8, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +8, DW_OP_stack_value) DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x022e => {0x0000022e} "p0") @@ -2942,46 +2942,46 @@ Abbrev table for offset: 0x00000000 0x000002f2: NULL 0x000002f3: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x00000000000003ad) + DW_AT_low_pc [DW_FORM_addr] (0x00000000000003a3) 0x000002f8: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x00000000000003ba) + DW_AT_low_pc [DW_FORM_addr] (0x00000000000003b0) 0x000002fd: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x00000000000003de) + DW_AT_low_pc [DW_FORM_addr] (0x00000000000003d4) 0x00000302: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000412) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000408) 0x00000307: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000418) + DW_AT_low_pc [DW_FORM_addr] (0x000000000000040e) 0x0000030c: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x000000000000047e) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000474) 0x00000311: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000490) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000486) 0x00000316: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x000000000000054e) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000544) 0x0000031b: DW_TAG_GNU_call_site [16] DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x019a => {0x0000019a} "free") - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000608) + DW_AT_low_pc [DW_FORM_addr] (0x00000000000005fe) 0x00000324: DW_TAG_GNU_call_site [16] DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x019a => {0x0000019a} "free") - DW_AT_low_pc [DW_FORM_addr] (0x000000000000060c) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000602) 0x0000032d: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x000000000000061e) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000614) 0x00000332: DW_TAG_GNU_call_site [16] DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x019a => {0x0000019a} "free") - DW_AT_low_pc [DW_FORM_addr] (0x000000000000062b) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000621) 0x0000033b: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000656) + DW_AT_low_pc [DW_FORM_addr] (0x000000000000064c) 0x00000340: NULL @@ -3006,13 +3006,13 @@ Abbrev table for offset: 0x00000000 0x0000001d: [0xffffffff, 0x00000027): [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value - [0x0000003d, 0x00000042): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value + [0x0000003b, 0x00000040): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +1, DW_OP_stack_value - [0x0000010c, 0x00000116): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value + [0x00000103, 0x0000010d): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value - [0x00000235, 0x00000240): DW_OP_consts +0, DW_OP_stack_value + [0x0000022b, 0x00000236): DW_OP_consts +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +1, DW_OP_stack_value - [0x00000289, 0x00000293): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value + [0x0000027f, 0x00000289): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value 0x000000a5: @@ -3032,40 +3032,40 @@ Abbrev table for offset: 0x00000000 [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +6, DW_OP_stack_value 0x0000011d: - [0xffffffff, 0x000001e2): + [0xffffffff, 0x000001d9): [0x00000000, 0x00000005): DW_OP_WASM_location 0x0 +2, DW_OP_stack_value - [0x0000017d, 0x00000182): DW_OP_WASM_location 0x0 +2, DW_OP_stack_value + [0x0000017c, 0x00000181): DW_OP_WASM_location 0x0 +2, DW_OP_stack_value 0x00000149: - [0xffffffff, 0x000000d7): + [0xffffffff, 0x000000ce): [0x00000000, 0x00000013): DW_OP_consts +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +13, DW_OP_stack_value [0x00000085, 0x0000008d): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value - [0x00000185, 0x00000190): DW_OP_consts +0, DW_OP_stack_value + [0x00000184, 0x0000018f): DW_OP_consts +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +10, DW_OP_stack_value - [0x00000202, 0x0000020a): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value + [0x00000201, 0x00000209): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value 0x000001ab: - [0xffffffff, 0x000000e6): + [0xffffffff, 0x000000dd): [0x00000000, 0x00000004): DW_OP_WASM_location 0x0 +12, DW_OP_stack_value - [0x0000017d, 0x00000181): DW_OP_WASM_location 0x0 +16, DW_OP_stack_value + [0x0000017c, 0x00000180): DW_OP_WASM_location 0x0 +16, DW_OP_stack_value 0x000001d7: - [0xffffffff, 0x000000fe): + [0xffffffff, 0x000000f5): [0x00000000, 0x00000004): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value [0x0000003c, 0x0000003f): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value - [0x0000017d, 0x00000181): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value - [0x000001b9, 0x000001bc): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value + [0x0000017c, 0x00000180): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value + [0x000001b8, 0x000001bb): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value 0x0000021f: - [0xffffffff, 0x00000113): + [0xffffffff, 0x0000010a): [0x00000000, 0x0000002a): DW_OP_WASM_location 0x0 +15, DW_OP_stack_value [0x0000003b, 0x00000051): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value - [0x0000017d, 0x000001a7): DW_OP_WASM_location 0x0 +14, DW_OP_stack_value - [0x000001b8, 0x000001ce): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value + [0x0000017c, 0x000001a6): DW_OP_WASM_location 0x0 +14, DW_OP_stack_value + [0x000001b7, 0x000001cd): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value 0x00000267: - [0xffffffff, 0x000003af): + [0xffffffff, 0x000003a5): [0x00000000, 0x00000005): DW_OP_WASM_location 0x0 +4, DW_OP_stack_value 0x00000285: @@ -3073,12 +3073,12 @@ Abbrev table for offset: 0x00000000 [0x00000001, 0x00000001): DW_OP_consts +30, DW_OP_stack_value 0x000002a2: - [0xffffffff, 0x00000627): + [0xffffffff, 0x0000061d): [0x00000001, 0x00000001): DW_OP_lit0, DW_OP_stack_value [0x00000000, 0x00000018): DW_OP_WASM_location 0x0 +6, DW_OP_stack_value 0x000002cc: - [0xffffffff, 0x000003fe): + [0xffffffff, 0x000003f4): [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value [0x00000000, 0x00000005): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value @@ -3090,36 +3090,36 @@ Abbrev table for offset: 0x00000000 [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value 0x00000354: - [0xffffffff, 0x00000414): + [0xffffffff, 0x0000040a): [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value 0x00000372: - [0xffffffff, 0x0000041a): + [0xffffffff, 0x00000410): [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +5, DW_OP_stack_value 0x00000390: - [0xffffffff, 0x00000537): + [0xffffffff, 0x0000052d): [0x00000000, 0x00000007): DW_OP_WASM_location 0x0 +6, DW_OP_stack_value [0x000000be, 0x000000c5): DW_OP_WASM_location 0x0 +6, DW_OP_stack_value 0x000003bc: - [0xffffffff, 0x0000058e): + [0xffffffff, 0x00000584): [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +8, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +8, DW_OP_stack_value 0x000003e8: - [0xffffffff, 0x00000610): + [0xffffffff, 0x00000606): [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value [0x00000027, 0x0000002f): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value 0x00000413: - [0xffffffff, 0x00000620): + [0xffffffff, 0x00000616): [0x00000000, 0x0000001f): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value .debug_line contents: debug_line[0x00000000] Line table prologue: - total_length: 0x00000a4e + total_length: 0x00000a36 version: 4 prologue_length: 0x000000dd min_inst_length: 1 @@ -3204,1422 +3204,1408 @@ file_names[ 4]: 0x000000000000003d 36 18 1 0 0 is_stmt -0x0000012e: 00 DW_LNE_set_address (0x0000000000000047) +0x0000012e: 00 DW_LNE_set_address (0x0000000000000045) 0x00000135: 03 DW_LNS_advance_line (37) 0x00000137: 01 DW_LNS_copy - 0x0000000000000047 37 18 1 0 0 is_stmt + 0x0000000000000045 37 18 1 0 0 is_stmt -0x00000138: 00 DW_LNE_set_address (0x0000000000000050) +0x00000138: 00 DW_LNE_set_address (0x000000000000004e) 0x0000013f: 03 DW_LNS_advance_line (38) 0x00000141: 05 DW_LNS_set_column (7) 0x00000143: 01 DW_LNS_copy - 0x0000000000000050 38 7 1 0 0 is_stmt + 0x000000000000004e 38 7 1 0 0 is_stmt -0x00000144: 00 DW_LNE_set_address (0x0000000000000058) +0x00000144: 00 DW_LNE_set_address (0x0000000000000056) 0x0000014b: 05 DW_LNS_set_column (16) 0x0000014d: 06 DW_LNS_negate_stmt 0x0000014e: 01 DW_LNS_copy - 0x0000000000000058 38 16 1 0 0 + 0x0000000000000056 38 16 1 0 0 -0x0000014f: 00 DW_LNE_set_address (0x000000000000005d) +0x0000014f: 00 DW_LNE_set_address (0x000000000000005b) 0x00000156: 03 DW_LNS_advance_line (37) 0x00000158: 05 DW_LNS_set_column (24) 0x0000015a: 06 DW_LNS_negate_stmt 0x0000015b: 01 DW_LNS_copy - 0x000000000000005d 37 24 1 0 0 is_stmt + 0x000000000000005b 37 24 1 0 0 is_stmt -0x0000015c: 00 DW_LNE_set_address (0x0000000000000062) +0x0000015c: 00 DW_LNE_set_address (0x0000000000000060) 0x00000163: 05 DW_LNS_set_column (18) 0x00000165: 06 DW_LNS_negate_stmt 0x00000166: 01 DW_LNS_copy - 0x0000000000000062 37 18 1 0 0 + 0x0000000000000060 37 18 1 0 0 -0x00000167: 00 DW_LNE_set_address (0x0000000000000067) +0x00000167: 00 DW_LNE_set_address (0x0000000000000065) 0x0000016e: 05 DW_LNS_set_column (4) 0x00000170: 01 DW_LNS_copy - 0x0000000000000067 37 4 1 0 0 + 0x0000000000000065 37 4 1 0 0 -0x00000171: 00 DW_LNE_set_address (0x000000000000006a) +0x00000171: 00 DW_LNE_set_address (0x0000000000000068) 0x00000178: 03 DW_LNS_advance_line (39) 0x0000017a: 06 DW_LNS_negate_stmt 0x0000017b: 01 DW_LNS_copy - 0x000000000000006a 39 4 1 0 0 is_stmt + 0x0000000000000068 39 4 1 0 0 is_stmt -0x0000017c: 00 DW_LNE_set_address (0x000000000000006c) +0x0000017c: 00 DW_LNE_set_address (0x000000000000006a) 0x00000183: 05 DW_LNS_set_column (16) 0x00000185: 06 DW_LNS_negate_stmt 0x00000186: 01 DW_LNS_copy - 0x000000000000006c 39 16 1 0 0 + 0x000000000000006a 39 16 1 0 0 -0x00000187: 00 DW_LNE_set_address (0x0000000000000075) +0x00000187: 00 DW_LNE_set_address (0x0000000000000073) 0x0000018e: 05 DW_LNS_set_column (4) 0x00000190: 01 DW_LNS_copy - 0x0000000000000075 39 4 1 0 0 + 0x0000000000000073 39 4 1 0 0 -0x00000191: 00 DW_LNE_set_address (0x0000000000000077) +0x00000191: 00 DW_LNE_set_address (0x0000000000000075) 0x00000198: 05 DW_LNS_set_column (23) 0x0000019a: 01 DW_LNS_copy - 0x0000000000000077 39 23 1 0 0 + 0x0000000000000075 39 23 1 0 0 -0x0000019b: 00 DW_LNE_set_address (0x000000000000007c) +0x0000019b: 00 DW_LNE_set_address (0x000000000000007a) 0x000001a2: 05 DW_LNS_set_column (19) 0x000001a4: 01 DW_LNS_copy - 0x000000000000007c 39 19 1 0 0 + 0x000000000000007a 39 19 1 0 0 -0x000001a5: 00 DW_LNE_set_address (0x0000000000000081) +0x000001a5: 00 DW_LNE_set_address (0x000000000000007f) 0x000001ac: 03 DW_LNS_advance_line (40) 0x000001ae: 05 DW_LNS_set_column (4) 0x000001b0: 06 DW_LNS_negate_stmt 0x000001b1: 01 DW_LNS_copy - 0x0000000000000081 40 4 1 0 0 is_stmt + 0x000000000000007f 40 4 1 0 0 is_stmt -0x000001b2: 00 DW_LNE_set_address (0x0000000000000089) +0x000001b2: 00 DW_LNE_set_address (0x0000000000000087) 0x000001b9: 05 DW_LNS_set_column (17) 0x000001bb: 06 DW_LNS_negate_stmt 0x000001bc: 01 DW_LNS_copy - 0x0000000000000089 40 17 1 0 0 + 0x0000000000000087 40 17 1 0 0 0x000001bd: 00 DW_LNE_set_address (0x0000000000000090) -0x000001c4: 03 DW_LNS_advance_line (37) -0x000001c6: 05 DW_LNS_set_column (18) +0x000001c4: 03 DW_LNS_advance_line (44) +0x000001c6: 05 DW_LNS_set_column (16) 0x000001c8: 06 DW_LNS_negate_stmt 0x000001c9: 01 DW_LNS_copy - 0x0000000000000090 37 18 1 0 0 is_stmt + 0x0000000000000090 44 16 1 0 0 is_stmt -0x000001ca: 00 DW_LNE_set_address (0x0000000000000095) -0x000001d1: 03 DW_LNS_advance_line (43) -0x000001d3: 05 DW_LNS_set_column (4) +0x000001ca: 00 DW_LNE_set_address (0x0000000000000099) +0x000001d1: 03 DW_LNS_advance_line (45) +0x000001d3: 05 DW_LNS_set_column (10) 0x000001d5: 01 DW_LNS_copy - 0x0000000000000095 43 4 1 0 0 is_stmt + 0x0000000000000099 45 10 1 0 0 is_stmt -0x000001d6: 00 DW_LNE_set_address (0x0000000000000099) -0x000001dd: 03 DW_LNS_advance_line (44) -0x000001df: 05 DW_LNS_set_column (16) -0x000001e1: 01 DW_LNS_copy - 0x0000000000000099 44 16 1 0 0 is_stmt +0x000001d6: 00 DW_LNE_set_address (0x000000000000009b) +0x000001dd: 05 DW_LNS_set_column (18) +0x000001df: 06 DW_LNS_negate_stmt +0x000001e0: 01 DW_LNS_copy + 0x000000000000009b 45 18 1 0 0 -0x000001e2: 00 DW_LNE_set_address (0x00000000000000a2) -0x000001e9: 03 DW_LNS_advance_line (45) -0x000001eb: 05 DW_LNS_set_column (10) -0x000001ed: 01 DW_LNS_copy - 0x00000000000000a2 45 10 1 0 0 is_stmt +0x000001e1: 00 DW_LNE_set_address (0x00000000000000a4) +0x000001e8: 05 DW_LNS_set_column (10) +0x000001ea: 01 DW_LNS_copy + 0x00000000000000a4 45 10 1 0 0 -0x000001ee: 00 DW_LNE_set_address (0x00000000000000a4) -0x000001f5: 05 DW_LNS_set_column (18) -0x000001f7: 06 DW_LNS_negate_stmt -0x000001f8: 01 DW_LNS_copy - 0x00000000000000a4 45 18 1 0 0 +0x000001eb: 00 DW_LNE_set_address (0x00000000000000a6) +0x000001f2: 05 DW_LNS_set_column (23) +0x000001f4: 01 DW_LNS_copy + 0x00000000000000a6 45 23 1 0 0 -0x000001f9: 00 DW_LNE_set_address (0x00000000000000ad) -0x00000200: 05 DW_LNS_set_column (10) -0x00000202: 01 DW_LNS_copy - 0x00000000000000ad 45 10 1 0 0 +0x000001f5: 00 DW_LNE_set_address (0x00000000000000ab) +0x000001fc: 03 DW_LNS_advance_line (44) +0x000001fe: 05 DW_LNS_set_column (16) +0x00000200: 06 DW_LNS_negate_stmt +0x00000201: 01 DW_LNS_copy + 0x00000000000000ab 44 16 1 0 0 is_stmt -0x00000203: 00 DW_LNE_set_address (0x00000000000000af) -0x0000020a: 05 DW_LNS_set_column (23) -0x0000020c: 01 DW_LNS_copy - 0x00000000000000af 45 23 1 0 0 +0x00000202: 00 DW_LNE_set_address (0x00000000000000b8) +0x00000209: 03 DW_LNS_advance_line (46) +0x0000020b: 05 DW_LNS_set_column (11) +0x0000020d: 01 DW_LNS_copy + 0x00000000000000b8 46 11 1 0 0 is_stmt -0x0000020d: 00 DW_LNE_set_address (0x00000000000000b4) -0x00000214: 03 DW_LNS_advance_line (44) -0x00000216: 05 DW_LNS_set_column (16) -0x00000218: 06 DW_LNS_negate_stmt -0x00000219: 01 DW_LNS_copy - 0x00000000000000b4 44 16 1 0 0 is_stmt +0x0000020e: 00 DW_LNE_set_address (0x00000000000000c4) +0x00000215: 05 DW_LNS_set_column (28) +0x00000217: 06 DW_LNS_negate_stmt +0x00000218: 01 DW_LNS_copy + 0x00000000000000c4 46 28 1 0 0 -0x0000021a: 00 DW_LNE_set_address (0x00000000000000c1) -0x00000221: 03 DW_LNS_advance_line (46) -0x00000223: 05 DW_LNS_set_column (11) -0x00000225: 01 DW_LNS_copy - 0x00000000000000c1 46 11 1 0 0 is_stmt +0x00000219: 00 DW_LNE_set_address (0x00000000000000c9) +0x00000220: 05 DW_LNS_set_column (41) +0x00000222: 01 DW_LNS_copy + 0x00000000000000c9 46 41 1 0 0 -0x00000226: 00 DW_LNE_set_address (0x00000000000000cd) -0x0000022d: 05 DW_LNS_set_column (28) -0x0000022f: 06 DW_LNS_negate_stmt -0x00000230: 01 DW_LNS_copy - 0x00000000000000cd 46 28 1 0 0 +0x00000223: 00 DW_LNE_set_address (0x00000000000000ce) +0x0000022a: 03 DW_LNS_advance_line (48) +0x0000022c: 05 DW_LNS_set_column (21) +0x0000022e: 06 DW_LNS_negate_stmt +0x0000022f: 01 DW_LNS_copy + 0x00000000000000ce 48 21 1 0 0 is_stmt -0x00000231: 00 DW_LNE_set_address (0x00000000000000d2) -0x00000238: 05 DW_LNS_set_column (41) -0x0000023a: 01 DW_LNS_copy - 0x00000000000000d2 46 41 1 0 0 +0x00000230: 00 DW_LNE_set_address (0x00000000000000d6) +0x00000237: 03 DW_LNS_advance_line (50) +0x00000239: 05 DW_LNS_set_column (14) +0x0000023b: 01 DW_LNS_copy + 0x00000000000000d6 50 14 1 0 0 is_stmt -0x0000023b: 00 DW_LNE_set_address (0x00000000000000d7) -0x00000242: 03 DW_LNS_advance_line (48) -0x00000244: 05 DW_LNS_set_column (21) -0x00000246: 06 DW_LNS_negate_stmt +0x0000023c: 00 DW_LNE_set_address (0x00000000000000e7) +0x00000243: 03 DW_LNS_advance_line (52) +0x00000245: 05 DW_LNS_set_column (38) 0x00000247: 01 DW_LNS_copy - 0x00000000000000d7 48 21 1 0 0 is_stmt + 0x00000000000000e7 52 38 1 0 0 is_stmt -0x00000248: 00 DW_LNE_set_address (0x00000000000000df) -0x0000024f: 03 DW_LNS_advance_line (50) -0x00000251: 05 DW_LNS_set_column (14) +0x00000248: 00 DW_LNE_set_address (0x00000000000000fb) +0x0000024f: 03 DW_LNS_advance_line (53) +0x00000251: 05 DW_LNS_set_column (22) 0x00000253: 01 DW_LNS_copy - 0x00000000000000df 50 14 1 0 0 is_stmt + 0x00000000000000fb 53 22 1 0 0 is_stmt -0x00000254: 00 DW_LNE_set_address (0x00000000000000f0) -0x0000025b: 03 DW_LNS_advance_line (52) -0x0000025d: 05 DW_LNS_set_column (38) +0x00000254: 00 DW_LNE_set_address (0x000000000000010a) +0x0000025b: 03 DW_LNS_advance_line (54) +0x0000025d: 05 DW_LNS_set_column (24) 0x0000025f: 01 DW_LNS_copy - 0x00000000000000f0 52 38 1 0 0 is_stmt + 0x000000000000010a 54 24 1 0 0 is_stmt -0x00000260: 00 DW_LNE_set_address (0x0000000000000104) -0x00000267: 03 DW_LNS_advance_line (53) -0x00000269: 05 DW_LNS_set_column (22) -0x0000026b: 01 DW_LNS_copy - 0x0000000000000104 53 22 1 0 0 is_stmt +0x00000260: 00 DW_LNE_set_address (0x000000000000010c) +0x00000267: 05 DW_LNS_set_column (26) +0x00000269: 06 DW_LNS_negate_stmt +0x0000026a: 01 DW_LNS_copy + 0x000000000000010c 54 26 1 0 0 -0x0000026c: 00 DW_LNE_set_address (0x0000000000000113) -0x00000273: 03 DW_LNS_advance_line (54) -0x00000275: 05 DW_LNS_set_column (24) -0x00000277: 01 DW_LNS_copy - 0x0000000000000113 54 24 1 0 0 is_stmt +0x0000026b: 00 DW_LNE_set_address (0x0000000000000119) +0x00000272: 05 DW_LNS_set_column (24) +0x00000274: 01 DW_LNS_copy + 0x0000000000000119 54 24 1 0 0 -0x00000278: 00 DW_LNE_set_address (0x0000000000000115) -0x0000027f: 05 DW_LNS_set_column (26) -0x00000281: 06 DW_LNS_negate_stmt -0x00000282: 01 DW_LNS_copy - 0x0000000000000115 54 26 1 0 0 +0x00000275: 00 DW_LNE_set_address (0x000000000000011c) +0x0000027c: 03 DW_LNS_advance_line (55) +0x0000027e: 06 DW_LNS_negate_stmt +0x0000027f: 01 DW_LNS_copy + 0x000000000000011c 55 24 1 0 0 is_stmt -0x00000283: 00 DW_LNE_set_address (0x0000000000000122) -0x0000028a: 05 DW_LNS_set_column (24) -0x0000028c: 01 DW_LNS_copy - 0x0000000000000122 54 24 1 0 0 +0x00000280: 00 DW_LNE_set_address (0x0000000000000123) +0x00000287: 03 DW_LNS_advance_line (52) +0x00000289: 05 DW_LNS_set_column (44) +0x0000028b: 01 DW_LNS_copy + 0x0000000000000123 52 44 1 0 0 is_stmt -0x0000028d: 00 DW_LNE_set_address (0x0000000000000125) -0x00000294: 03 DW_LNS_advance_line (55) -0x00000296: 06 DW_LNS_negate_stmt -0x00000297: 01 DW_LNS_copy - 0x0000000000000125 55 24 1 0 0 is_stmt +0x0000028c: 00 DW_LNE_set_address (0x000000000000012f) +0x00000293: 05 DW_LNS_set_column (38) +0x00000295: 06 DW_LNS_negate_stmt +0x00000296: 01 DW_LNS_copy + 0x000000000000012f 52 38 1 0 0 -0x00000298: 00 DW_LNE_set_address (0x000000000000012c) -0x0000029f: 03 DW_LNS_advance_line (52) -0x000002a1: 05 DW_LNS_set_column (44) -0x000002a3: 01 DW_LNS_copy - 0x000000000000012c 52 44 1 0 0 is_stmt +0x00000297: 00 DW_LNE_set_address (0x0000000000000132) +0x0000029e: 05 DW_LNS_set_column (13) +0x000002a0: 01 DW_LNS_copy + 0x0000000000000132 52 13 1 0 0 -0x000002a4: 00 DW_LNE_set_address (0x0000000000000138) -0x000002ab: 05 DW_LNS_set_column (38) -0x000002ad: 06 DW_LNS_negate_stmt -0x000002ae: 01 DW_LNS_copy - 0x0000000000000138 52 38 1 0 0 +0x000002a1: 00 DW_LNE_set_address (0x0000000000000136) +0x000002a8: 03 DW_LNS_advance_line (58) +0x000002aa: 05 DW_LNS_set_column (19) +0x000002ac: 06 DW_LNS_negate_stmt +0x000002ad: 01 DW_LNS_copy + 0x0000000000000136 58 19 1 0 0 is_stmt -0x000002af: 00 DW_LNE_set_address (0x000000000000013b) -0x000002b6: 05 DW_LNS_set_column (13) -0x000002b8: 01 DW_LNS_copy - 0x000000000000013b 52 13 1 0 0 +0x000002ae: 00 DW_LNE_set_address (0x0000000000000145) +0x000002b5: 03 DW_LNS_advance_line (59) +0x000002b7: 05 DW_LNS_set_column (21) +0x000002b9: 01 DW_LNS_copy + 0x0000000000000145 59 21 1 0 0 is_stmt -0x000002b9: 00 DW_LNE_set_address (0x000000000000013f) -0x000002c0: 03 DW_LNS_advance_line (58) -0x000002c2: 05 DW_LNS_set_column (19) -0x000002c4: 06 DW_LNS_negate_stmt +0x000002ba: 00 DW_LNE_set_address (0x000000000000014c) +0x000002c1: 03 DW_LNS_advance_line (57) +0x000002c3: 05 DW_LNS_set_column (18) 0x000002c5: 01 DW_LNS_copy - 0x000000000000013f 58 19 1 0 0 is_stmt + 0x000000000000014c 57 18 1 0 0 is_stmt -0x000002c6: 00 DW_LNE_set_address (0x000000000000014e) -0x000002cd: 03 DW_LNS_advance_line (59) -0x000002cf: 05 DW_LNS_set_column (21) +0x000002c6: 00 DW_LNE_set_address (0x000000000000015c) +0x000002cd: 03 DW_LNS_advance_line (62) +0x000002cf: 05 DW_LNS_set_column (14) 0x000002d1: 01 DW_LNS_copy - 0x000000000000014e 59 21 1 0 0 is_stmt + 0x000000000000015c 62 14 1 0 0 is_stmt -0x000002d2: 00 DW_LNE_set_address (0x0000000000000155) -0x000002d9: 03 DW_LNS_advance_line (57) -0x000002db: 05 DW_LNS_set_column (18) -0x000002dd: 01 DW_LNS_copy - 0x0000000000000155 57 18 1 0 0 is_stmt +0x000002d2: 00 DW_LNE_set_address (0x0000000000000160) +0x000002d9: 05 DW_LNS_set_column (23) +0x000002db: 06 DW_LNS_negate_stmt +0x000002dc: 01 DW_LNS_copy + 0x0000000000000160 62 23 1 0 0 -0x000002de: 00 DW_LNE_set_address (0x0000000000000165) -0x000002e5: 03 DW_LNS_advance_line (62) -0x000002e7: 05 DW_LNS_set_column (14) -0x000002e9: 01 DW_LNS_copy - 0x0000000000000165 62 14 1 0 0 is_stmt +0x000002dd: 00 DW_LNE_set_address (0x0000000000000165) +0x000002e4: 05 DW_LNS_set_column (14) +0x000002e6: 01 DW_LNS_copy + 0x0000000000000165 62 14 1 0 0 -0x000002ea: 00 DW_LNE_set_address (0x0000000000000169) -0x000002f1: 05 DW_LNS_set_column (23) -0x000002f3: 06 DW_LNS_negate_stmt -0x000002f4: 01 DW_LNS_copy - 0x0000000000000169 62 23 1 0 0 +0x000002e7: 00 DW_LNE_set_address (0x0000000000000169) +0x000002ee: 03 DW_LNS_advance_line (66) +0x000002f0: 05 DW_LNS_set_column (16) +0x000002f2: 06 DW_LNS_negate_stmt +0x000002f3: 01 DW_LNS_copy + 0x0000000000000169 66 16 1 0 0 is_stmt -0x000002f5: 00 DW_LNE_set_address (0x000000000000016e) -0x000002fc: 05 DW_LNS_set_column (14) -0x000002fe: 01 DW_LNS_copy - 0x000000000000016e 62 14 1 0 0 +0x000002f4: 00 DW_LNE_set_address (0x0000000000000176) +0x000002fb: 03 DW_LNS_advance_line (75) +0x000002fd: 05 DW_LNS_set_column (27) +0x000002ff: 01 DW_LNS_copy + 0x0000000000000176 75 27 1 0 0 is_stmt -0x000002ff: 00 DW_LNE_set_address (0x0000000000000172) -0x00000306: 03 DW_LNS_advance_line (66) -0x00000308: 05 DW_LNS_set_column (16) -0x0000030a: 06 DW_LNS_negate_stmt +0x00000300: 00 DW_LNE_set_address (0x000000000000017f) +0x00000307: 03 DW_LNS_advance_line (76) +0x00000309: 05 DW_LNS_set_column (16) 0x0000030b: 01 DW_LNS_copy - 0x0000000000000172 66 16 1 0 0 is_stmt + 0x000000000000017f 76 16 1 0 0 is_stmt -0x0000030c: 00 DW_LNE_set_address (0x000000000000017f) -0x00000313: 03 DW_LNS_advance_line (75) -0x00000315: 05 DW_LNS_set_column (27) -0x00000317: 01 DW_LNS_copy - 0x000000000000017f 75 27 1 0 0 is_stmt +0x0000030c: 00 DW_LNE_set_address (0x0000000000000187) +0x00000313: 05 DW_LNS_set_column (27) +0x00000315: 06 DW_LNS_negate_stmt +0x00000316: 01 DW_LNS_copy + 0x0000000000000187 76 27 1 0 0 -0x00000318: 00 DW_LNE_set_address (0x0000000000000188) -0x0000031f: 03 DW_LNS_advance_line (76) -0x00000321: 05 DW_LNS_set_column (16) -0x00000323: 01 DW_LNS_copy - 0x0000000000000188 76 16 1 0 0 is_stmt +0x00000317: 00 DW_LNE_set_address (0x0000000000000189) +0x0000031e: 05 DW_LNS_set_column (35) +0x00000320: 01 DW_LNS_copy + 0x0000000000000189 76 35 1 0 0 -0x00000324: 00 DW_LNE_set_address (0x0000000000000190) -0x0000032b: 05 DW_LNS_set_column (27) -0x0000032d: 06 DW_LNS_negate_stmt -0x0000032e: 01 DW_LNS_copy - 0x0000000000000190 76 27 1 0 0 +0x00000321: 00 DW_LNE_set_address (0x0000000000000192) +0x00000328: 05 DW_LNS_set_column (27) +0x0000032a: 01 DW_LNS_copy + 0x0000000000000192 76 27 1 0 0 -0x0000032f: 00 DW_LNE_set_address (0x0000000000000192) -0x00000336: 05 DW_LNS_set_column (35) -0x00000338: 01 DW_LNS_copy - 0x0000000000000192 76 35 1 0 0 +0x0000032b: 00 DW_LNE_set_address (0x0000000000000197) +0x00000332: 05 DW_LNS_set_column (25) +0x00000334: 01 DW_LNS_copy + 0x0000000000000197 76 25 1 0 0 -0x00000339: 00 DW_LNE_set_address (0x000000000000019b) -0x00000340: 05 DW_LNS_set_column (27) -0x00000342: 01 DW_LNS_copy - 0x000000000000019b 76 27 1 0 0 +0x00000335: 00 DW_LNE_set_address (0x000000000000019a) +0x0000033c: 03 DW_LNS_advance_line (75) +0x0000033e: 05 DW_LNS_set_column (27) +0x00000340: 06 DW_LNS_negate_stmt +0x00000341: 01 DW_LNS_copy + 0x000000000000019a 75 27 1 0 0 is_stmt -0x00000343: 00 DW_LNE_set_address (0x00000000000001a0) -0x0000034a: 05 DW_LNS_set_column (25) +0x00000342: 00 DW_LNE_set_address (0x000000000000019f) +0x00000349: 05 DW_LNS_set_column (13) +0x0000034b: 06 DW_LNS_negate_stmt 0x0000034c: 01 DW_LNS_copy - 0x00000000000001a0 76 25 1 0 0 + 0x000000000000019f 75 13 1 0 0 -0x0000034d: 00 DW_LNE_set_address (0x00000000000001a3) -0x00000354: 03 DW_LNS_advance_line (75) -0x00000356: 05 DW_LNS_set_column (27) -0x00000358: 06 DW_LNS_negate_stmt -0x00000359: 01 DW_LNS_copy - 0x00000000000001a3 75 27 1 0 0 is_stmt +0x0000034d: 00 DW_LNE_set_address (0x00000000000001a7) +0x00000354: 03 DW_LNS_advance_line (77) +0x00000356: 06 DW_LNS_negate_stmt +0x00000357: 01 DW_LNS_copy + 0x00000000000001a7 77 13 1 0 0 is_stmt -0x0000035a: 00 DW_LNE_set_address (0x00000000000001a8) -0x00000361: 05 DW_LNS_set_column (13) -0x00000363: 06 DW_LNS_negate_stmt -0x00000364: 01 DW_LNS_copy - 0x00000000000001a8 75 13 1 0 0 +0x00000358: 00 DW_LNE_set_address (0x00000000000001af) +0x0000035f: 05 DW_LNS_set_column (22) +0x00000361: 06 DW_LNS_negate_stmt +0x00000362: 01 DW_LNS_copy + 0x00000000000001af 77 22 1 0 0 -0x00000365: 00 DW_LNE_set_address (0x00000000000001b0) -0x0000036c: 03 DW_LNS_advance_line (77) +0x00000363: 00 DW_LNE_set_address (0x00000000000001b4) +0x0000036a: 03 DW_LNS_advance_line (79) +0x0000036c: 05 DW_LNS_set_column (16) 0x0000036e: 06 DW_LNS_negate_stmt 0x0000036f: 01 DW_LNS_copy - 0x00000000000001b0 77 13 1 0 0 is_stmt + 0x00000000000001b4 79 16 1 0 0 is_stmt -0x00000370: 00 DW_LNE_set_address (0x00000000000001b8) -0x00000377: 05 DW_LNS_set_column (22) +0x00000370: 00 DW_LNE_set_address (0x00000000000001bc) +0x00000377: 05 DW_LNS_set_column (14) 0x00000379: 06 DW_LNS_negate_stmt 0x0000037a: 01 DW_LNS_copy - 0x00000000000001b8 77 22 1 0 0 + 0x00000000000001bc 79 14 1 0 0 -0x0000037b: 00 DW_LNE_set_address (0x00000000000001bd) -0x00000382: 03 DW_LNS_advance_line (79) -0x00000384: 05 DW_LNS_set_column (16) -0x00000386: 06 DW_LNS_negate_stmt -0x00000387: 01 DW_LNS_copy - 0x00000000000001bd 79 16 1 0 0 is_stmt +0x0000037b: 00 DW_LNE_set_address (0x00000000000001cb) +0x00000382: 05 DW_LNS_set_column (25) +0x00000384: 01 DW_LNS_copy + 0x00000000000001cb 79 25 1 0 0 -0x00000388: 00 DW_LNE_set_address (0x00000000000001c5) -0x0000038f: 05 DW_LNS_set_column (14) -0x00000391: 06 DW_LNS_negate_stmt -0x00000392: 01 DW_LNS_copy - 0x00000000000001c5 79 14 1 0 0 +0x00000385: 00 DW_LNE_set_address (0x00000000000001d2) +0x0000038c: 03 DW_LNS_advance_line (81) +0x0000038e: 05 DW_LNS_set_column (11) +0x00000390: 06 DW_LNS_negate_stmt +0x00000391: 01 DW_LNS_copy + 0x00000000000001d2 81 11 1 0 0 is_stmt -0x00000393: 00 DW_LNE_set_address (0x00000000000001d4) -0x0000039a: 05 DW_LNS_set_column (25) -0x0000039c: 01 DW_LNS_copy - 0x00000000000001d4 79 25 1 0 0 +0x00000392: 00 DW_LNE_set_address (0x00000000000001d7) +0x00000399: 03 DW_LNS_advance_line (66) +0x0000039b: 05 DW_LNS_set_column (16) +0x0000039d: 01 DW_LNS_copy + 0x00000000000001d7 66 16 1 0 0 is_stmt -0x0000039d: 00 DW_LNE_set_address (0x00000000000001db) -0x000003a4: 03 DW_LNS_advance_line (81) -0x000003a6: 05 DW_LNS_set_column (11) -0x000003a8: 06 DW_LNS_negate_stmt +0x0000039e: 00 DW_LNE_set_address (0x00000000000001de) +0x000003a5: 03 DW_LNS_advance_line (74) +0x000003a7: 05 DW_LNS_set_column (22) 0x000003a9: 01 DW_LNS_copy - 0x00000000000001db 81 11 1 0 0 is_stmt + 0x00000000000001de 74 22 1 0 0 is_stmt -0x000003aa: 00 DW_LNE_set_address (0x00000000000001e0) -0x000003b1: 03 DW_LNS_advance_line (66) -0x000003b3: 05 DW_LNS_set_column (16) +0x000003aa: 00 DW_LNE_set_address (0x00000000000001e7) +0x000003b1: 03 DW_LNS_advance_line (37) +0x000003b3: 05 DW_LNS_set_column (4) 0x000003b5: 01 DW_LNS_copy - 0x00000000000001e0 66 16 1 0 0 is_stmt + 0x00000000000001e7 37 4 1 0 0 is_stmt -0x000003b6: 00 DW_LNE_set_address (0x00000000000001e7) -0x000003bd: 03 DW_LNS_advance_line (74) -0x000003bf: 05 DW_LNS_set_column (22) -0x000003c1: 01 DW_LNS_copy - 0x00000000000001e7 74 22 1 0 0 is_stmt +0x000003b6: 00 DW_LNE_set_address (0x00000000000001ec) +0x000003bd: 03 DW_LNS_advance_line (39) +0x000003bf: 01 DW_LNS_copy + 0x00000000000001ec 39 4 1 0 0 is_stmt -0x000003c2: 00 DW_LNE_set_address (0x00000000000001f0) -0x000003c9: 03 DW_LNS_advance_line (37) -0x000003cb: 05 DW_LNS_set_column (4) -0x000003cd: 01 DW_LNS_copy - 0x00000000000001f0 37 4 1 0 0 is_stmt +0x000003c0: 00 DW_LNE_set_address (0x00000000000001ee) +0x000003c7: 05 DW_LNS_set_column (16) +0x000003c9: 06 DW_LNS_negate_stmt +0x000003ca: 01 DW_LNS_copy + 0x00000000000001ee 39 16 1 0 0 -0x000003ce: 00 DW_LNE_set_address (0x00000000000001f5) -0x000003d5: 03 DW_LNS_advance_line (39) -0x000003d7: 01 DW_LNS_copy - 0x00000000000001f5 39 4 1 0 0 is_stmt +0x000003cb: 00 DW_LNE_set_address (0x00000000000001f7) +0x000003d2: 05 DW_LNS_set_column (4) +0x000003d4: 01 DW_LNS_copy + 0x00000000000001f7 39 4 1 0 0 -0x000003d8: 00 DW_LNE_set_address (0x00000000000001f7) -0x000003df: 05 DW_LNS_set_column (16) -0x000003e1: 06 DW_LNS_negate_stmt -0x000003e2: 01 DW_LNS_copy - 0x00000000000001f7 39 16 1 0 0 +0x000003d5: 00 DW_LNE_set_address (0x00000000000001f9) +0x000003dc: 05 DW_LNS_set_column (23) +0x000003de: 01 DW_LNS_copy + 0x00000000000001f9 39 23 1 0 0 -0x000003e3: 00 DW_LNE_set_address (0x0000000000000200) -0x000003ea: 05 DW_LNS_set_column (4) -0x000003ec: 01 DW_LNS_copy - 0x0000000000000200 39 4 1 0 0 +0x000003df: 00 DW_LNE_set_address (0x00000000000001fe) +0x000003e6: 05 DW_LNS_set_column (19) +0x000003e8: 01 DW_LNS_copy + 0x00000000000001fe 39 19 1 0 0 -0x000003ed: 00 DW_LNE_set_address (0x0000000000000202) -0x000003f4: 05 DW_LNS_set_column (23) -0x000003f6: 01 DW_LNS_copy - 0x0000000000000202 39 23 1 0 0 +0x000003e9: 00 DW_LNE_set_address (0x0000000000000203) +0x000003f0: 03 DW_LNS_advance_line (40) +0x000003f2: 05 DW_LNS_set_column (4) +0x000003f4: 06 DW_LNS_negate_stmt +0x000003f5: 01 DW_LNS_copy + 0x0000000000000203 40 4 1 0 0 is_stmt -0x000003f7: 00 DW_LNE_set_address (0x0000000000000207) -0x000003fe: 05 DW_LNS_set_column (19) +0x000003f6: 00 DW_LNE_set_address (0x000000000000020b) +0x000003fd: 05 DW_LNS_set_column (17) +0x000003ff: 06 DW_LNS_negate_stmt 0x00000400: 01 DW_LNS_copy - 0x0000000000000207 39 19 1 0 0 + 0x000000000000020b 40 17 1 0 0 -0x00000401: 00 DW_LNE_set_address (0x000000000000020c) -0x00000408: 03 DW_LNS_advance_line (40) -0x0000040a: 05 DW_LNS_set_column (4) +0x00000401: 00 DW_LNE_set_address (0x0000000000000214) +0x00000408: 03 DW_LNS_advance_line (44) +0x0000040a: 05 DW_LNS_set_column (16) 0x0000040c: 06 DW_LNS_negate_stmt 0x0000040d: 01 DW_LNS_copy - 0x000000000000020c 40 4 1 0 0 is_stmt + 0x0000000000000214 44 16 1 0 0 is_stmt -0x0000040e: 00 DW_LNE_set_address (0x0000000000000214) -0x00000415: 05 DW_LNS_set_column (17) -0x00000417: 06 DW_LNS_negate_stmt -0x00000418: 01 DW_LNS_copy - 0x0000000000000214 40 17 1 0 0 +0x0000040e: 00 DW_LNE_set_address (0x000000000000021d) +0x00000415: 03 DW_LNS_advance_line (45) +0x00000417: 05 DW_LNS_set_column (10) +0x00000419: 01 DW_LNS_copy + 0x000000000000021d 45 10 1 0 0 is_stmt -0x00000419: 00 DW_LNE_set_address (0x000000000000021e) -0x00000420: 03 DW_LNS_advance_line (44) -0x00000422: 05 DW_LNS_set_column (16) -0x00000424: 06 DW_LNS_negate_stmt -0x00000425: 01 DW_LNS_copy - 0x000000000000021e 44 16 1 0 0 is_stmt +0x0000041a: 00 DW_LNE_set_address (0x000000000000021f) +0x00000421: 05 DW_LNS_set_column (18) +0x00000423: 06 DW_LNS_negate_stmt +0x00000424: 01 DW_LNS_copy + 0x000000000000021f 45 18 1 0 0 -0x00000426: 00 DW_LNE_set_address (0x0000000000000227) -0x0000042d: 03 DW_LNS_advance_line (45) -0x0000042f: 05 DW_LNS_set_column (10) -0x00000431: 01 DW_LNS_copy - 0x0000000000000227 45 10 1 0 0 is_stmt +0x00000425: 00 DW_LNE_set_address (0x0000000000000228) +0x0000042c: 05 DW_LNS_set_column (10) +0x0000042e: 01 DW_LNS_copy + 0x0000000000000228 45 10 1 0 0 -0x00000432: 00 DW_LNE_set_address (0x0000000000000229) -0x00000439: 05 DW_LNS_set_column (18) -0x0000043b: 06 DW_LNS_negate_stmt -0x0000043c: 01 DW_LNS_copy - 0x0000000000000229 45 18 1 0 0 +0x0000042f: 00 DW_LNE_set_address (0x000000000000022a) +0x00000436: 05 DW_LNS_set_column (23) +0x00000438: 01 DW_LNS_copy + 0x000000000000022a 45 23 1 0 0 -0x0000043d: 00 DW_LNE_set_address (0x0000000000000232) -0x00000444: 05 DW_LNS_set_column (10) -0x00000446: 01 DW_LNS_copy - 0x0000000000000232 45 10 1 0 0 +0x00000439: 00 DW_LNE_set_address (0x000000000000022f) +0x00000440: 03 DW_LNS_advance_line (44) +0x00000442: 05 DW_LNS_set_column (16) +0x00000444: 06 DW_LNS_negate_stmt +0x00000445: 01 DW_LNS_copy + 0x000000000000022f 44 16 1 0 0 is_stmt -0x00000447: 00 DW_LNE_set_address (0x0000000000000234) -0x0000044e: 05 DW_LNS_set_column (23) -0x00000450: 01 DW_LNS_copy - 0x0000000000000234 45 23 1 0 0 +0x00000446: 00 DW_LNE_set_address (0x000000000000023c) +0x0000044d: 03 DW_LNS_advance_line (46) +0x0000044f: 05 DW_LNS_set_column (11) +0x00000451: 01 DW_LNS_copy + 0x000000000000023c 46 11 1 0 0 is_stmt -0x00000451: 00 DW_LNE_set_address (0x0000000000000239) -0x00000458: 03 DW_LNS_advance_line (44) -0x0000045a: 05 DW_LNS_set_column (16) -0x0000045c: 06 DW_LNS_negate_stmt -0x0000045d: 01 DW_LNS_copy - 0x0000000000000239 44 16 1 0 0 is_stmt +0x00000452: 00 DW_LNE_set_address (0x0000000000000248) +0x00000459: 05 DW_LNS_set_column (28) +0x0000045b: 06 DW_LNS_negate_stmt +0x0000045c: 01 DW_LNS_copy + 0x0000000000000248 46 28 1 0 0 -0x0000045e: 00 DW_LNE_set_address (0x0000000000000246) -0x00000465: 03 DW_LNS_advance_line (46) -0x00000467: 05 DW_LNS_set_column (11) -0x00000469: 01 DW_LNS_copy - 0x0000000000000246 46 11 1 0 0 is_stmt +0x0000045d: 00 DW_LNE_set_address (0x000000000000024d) +0x00000464: 05 DW_LNS_set_column (41) +0x00000466: 01 DW_LNS_copy + 0x000000000000024d 46 41 1 0 0 -0x0000046a: 00 DW_LNE_set_address (0x0000000000000252) -0x00000471: 05 DW_LNS_set_column (28) -0x00000473: 06 DW_LNS_negate_stmt -0x00000474: 01 DW_LNS_copy - 0x0000000000000252 46 28 1 0 0 +0x00000467: 00 DW_LNE_set_address (0x0000000000000252) +0x0000046e: 03 DW_LNS_advance_line (50) +0x00000470: 05 DW_LNS_set_column (14) +0x00000472: 06 DW_LNS_negate_stmt +0x00000473: 01 DW_LNS_copy + 0x0000000000000252 50 14 1 0 0 is_stmt -0x00000475: 00 DW_LNE_set_address (0x0000000000000257) -0x0000047c: 05 DW_LNS_set_column (41) -0x0000047e: 01 DW_LNS_copy - 0x0000000000000257 46 41 1 0 0 +0x00000474: 00 DW_LNE_set_address (0x0000000000000263) +0x0000047b: 03 DW_LNS_advance_line (52) +0x0000047d: 05 DW_LNS_set_column (38) +0x0000047f: 01 DW_LNS_copy + 0x0000000000000263 52 38 1 0 0 is_stmt -0x0000047f: 00 DW_LNE_set_address (0x000000000000025c) -0x00000486: 03 DW_LNS_advance_line (50) -0x00000488: 05 DW_LNS_set_column (14) -0x0000048a: 06 DW_LNS_negate_stmt +0x00000480: 00 DW_LNE_set_address (0x0000000000000277) +0x00000487: 03 DW_LNS_advance_line (53) +0x00000489: 05 DW_LNS_set_column (22) 0x0000048b: 01 DW_LNS_copy - 0x000000000000025c 50 14 1 0 0 is_stmt + 0x0000000000000277 53 22 1 0 0 is_stmt -0x0000048c: 00 DW_LNE_set_address (0x000000000000026d) -0x00000493: 03 DW_LNS_advance_line (52) -0x00000495: 05 DW_LNS_set_column (38) +0x0000048c: 00 DW_LNE_set_address (0x0000000000000286) +0x00000493: 03 DW_LNS_advance_line (54) +0x00000495: 05 DW_LNS_set_column (24) 0x00000497: 01 DW_LNS_copy - 0x000000000000026d 52 38 1 0 0 is_stmt + 0x0000000000000286 54 24 1 0 0 is_stmt -0x00000498: 00 DW_LNE_set_address (0x0000000000000281) -0x0000049f: 03 DW_LNS_advance_line (53) -0x000004a1: 05 DW_LNS_set_column (22) -0x000004a3: 01 DW_LNS_copy - 0x0000000000000281 53 22 1 0 0 is_stmt +0x00000498: 00 DW_LNE_set_address (0x0000000000000288) +0x0000049f: 05 DW_LNS_set_column (26) +0x000004a1: 06 DW_LNS_negate_stmt +0x000004a2: 01 DW_LNS_copy + 0x0000000000000288 54 26 1 0 0 -0x000004a4: 00 DW_LNE_set_address (0x0000000000000290) -0x000004ab: 03 DW_LNS_advance_line (54) -0x000004ad: 05 DW_LNS_set_column (24) -0x000004af: 01 DW_LNS_copy - 0x0000000000000290 54 24 1 0 0 is_stmt +0x000004a3: 00 DW_LNE_set_address (0x0000000000000295) +0x000004aa: 05 DW_LNS_set_column (24) +0x000004ac: 01 DW_LNS_copy + 0x0000000000000295 54 24 1 0 0 -0x000004b0: 00 DW_LNE_set_address (0x0000000000000292) -0x000004b7: 05 DW_LNS_set_column (26) -0x000004b9: 06 DW_LNS_negate_stmt -0x000004ba: 01 DW_LNS_copy - 0x0000000000000292 54 26 1 0 0 +0x000004ad: 00 DW_LNE_set_address (0x0000000000000298) +0x000004b4: 03 DW_LNS_advance_line (55) +0x000004b6: 06 DW_LNS_negate_stmt +0x000004b7: 01 DW_LNS_copy + 0x0000000000000298 55 24 1 0 0 is_stmt -0x000004bb: 00 DW_LNE_set_address (0x000000000000029f) -0x000004c2: 05 DW_LNS_set_column (24) -0x000004c4: 01 DW_LNS_copy - 0x000000000000029f 54 24 1 0 0 +0x000004b8: 00 DW_LNE_set_address (0x000000000000029f) +0x000004bf: 03 DW_LNS_advance_line (52) +0x000004c1: 05 DW_LNS_set_column (44) +0x000004c3: 01 DW_LNS_copy + 0x000000000000029f 52 44 1 0 0 is_stmt -0x000004c5: 00 DW_LNE_set_address (0x00000000000002a2) -0x000004cc: 03 DW_LNS_advance_line (55) -0x000004ce: 06 DW_LNS_negate_stmt -0x000004cf: 01 DW_LNS_copy - 0x00000000000002a2 55 24 1 0 0 is_stmt +0x000004c4: 00 DW_LNE_set_address (0x00000000000002ab) +0x000004cb: 05 DW_LNS_set_column (38) +0x000004cd: 06 DW_LNS_negate_stmt +0x000004ce: 01 DW_LNS_copy + 0x00000000000002ab 52 38 1 0 0 -0x000004d0: 00 DW_LNE_set_address (0x00000000000002a9) -0x000004d7: 03 DW_LNS_advance_line (52) -0x000004d9: 05 DW_LNS_set_column (44) +0x000004cf: 00 DW_LNE_set_address (0x00000000000002b2) +0x000004d6: 03 DW_LNS_advance_line (58) +0x000004d8: 05 DW_LNS_set_column (19) +0x000004da: 06 DW_LNS_negate_stmt 0x000004db: 01 DW_LNS_copy - 0x00000000000002a9 52 44 1 0 0 is_stmt + 0x00000000000002b2 58 19 1 0 0 is_stmt -0x000004dc: 00 DW_LNE_set_address (0x00000000000002b5) -0x000004e3: 05 DW_LNS_set_column (38) -0x000004e5: 06 DW_LNS_negate_stmt -0x000004e6: 01 DW_LNS_copy - 0x00000000000002b5 52 38 1 0 0 +0x000004dc: 00 DW_LNE_set_address (0x00000000000002c1) +0x000004e3: 03 DW_LNS_advance_line (59) +0x000004e5: 05 DW_LNS_set_column (21) +0x000004e7: 01 DW_LNS_copy + 0x00000000000002c1 59 21 1 0 0 is_stmt -0x000004e7: 00 DW_LNE_set_address (0x00000000000002bc) -0x000004ee: 03 DW_LNS_advance_line (58) -0x000004f0: 05 DW_LNS_set_column (19) -0x000004f2: 06 DW_LNS_negate_stmt +0x000004e8: 00 DW_LNE_set_address (0x00000000000002c8) +0x000004ef: 03 DW_LNS_advance_line (57) +0x000004f1: 05 DW_LNS_set_column (18) 0x000004f3: 01 DW_LNS_copy - 0x00000000000002bc 58 19 1 0 0 is_stmt + 0x00000000000002c8 57 18 1 0 0 is_stmt -0x000004f4: 00 DW_LNE_set_address (0x00000000000002cb) -0x000004fb: 03 DW_LNS_advance_line (59) -0x000004fd: 05 DW_LNS_set_column (21) +0x000004f4: 00 DW_LNE_set_address (0x00000000000002d8) +0x000004fb: 03 DW_LNS_advance_line (62) +0x000004fd: 05 DW_LNS_set_column (14) 0x000004ff: 01 DW_LNS_copy - 0x00000000000002cb 59 21 1 0 0 is_stmt + 0x00000000000002d8 62 14 1 0 0 is_stmt -0x00000500: 00 DW_LNE_set_address (0x00000000000002d2) -0x00000507: 03 DW_LNS_advance_line (57) -0x00000509: 05 DW_LNS_set_column (18) -0x0000050b: 01 DW_LNS_copy - 0x00000000000002d2 57 18 1 0 0 is_stmt +0x00000500: 00 DW_LNE_set_address (0x00000000000002dc) +0x00000507: 05 DW_LNS_set_column (23) +0x00000509: 06 DW_LNS_negate_stmt +0x0000050a: 01 DW_LNS_copy + 0x00000000000002dc 62 23 1 0 0 -0x0000050c: 00 DW_LNE_set_address (0x00000000000002e2) -0x00000513: 03 DW_LNS_advance_line (62) -0x00000515: 05 DW_LNS_set_column (14) -0x00000517: 01 DW_LNS_copy - 0x00000000000002e2 62 14 1 0 0 is_stmt +0x0000050b: 00 DW_LNE_set_address (0x00000000000002e1) +0x00000512: 05 DW_LNS_set_column (14) +0x00000514: 01 DW_LNS_copy + 0x00000000000002e1 62 14 1 0 0 -0x00000518: 00 DW_LNE_set_address (0x00000000000002e6) -0x0000051f: 05 DW_LNS_set_column (23) -0x00000521: 06 DW_LNS_negate_stmt -0x00000522: 01 DW_LNS_copy - 0x00000000000002e6 62 23 1 0 0 +0x00000515: 00 DW_LNE_set_address (0x00000000000002e5) +0x0000051c: 03 DW_LNS_advance_line (66) +0x0000051e: 05 DW_LNS_set_column (16) +0x00000520: 06 DW_LNS_negate_stmt +0x00000521: 01 DW_LNS_copy + 0x00000000000002e5 66 16 1 0 0 is_stmt -0x00000523: 00 DW_LNE_set_address (0x00000000000002eb) -0x0000052a: 05 DW_LNS_set_column (14) -0x0000052c: 01 DW_LNS_copy - 0x00000000000002eb 62 14 1 0 0 +0x00000522: 00 DW_LNE_set_address (0x00000000000002f2) +0x00000529: 03 DW_LNS_advance_line (75) +0x0000052b: 05 DW_LNS_set_column (27) +0x0000052d: 01 DW_LNS_copy + 0x00000000000002f2 75 27 1 0 0 is_stmt -0x0000052d: 00 DW_LNE_set_address (0x00000000000002ef) -0x00000534: 03 DW_LNS_advance_line (66) -0x00000536: 05 DW_LNS_set_column (16) -0x00000538: 06 DW_LNS_negate_stmt +0x0000052e: 00 DW_LNE_set_address (0x00000000000002fb) +0x00000535: 03 DW_LNS_advance_line (76) +0x00000537: 05 DW_LNS_set_column (16) 0x00000539: 01 DW_LNS_copy - 0x00000000000002ef 66 16 1 0 0 is_stmt + 0x00000000000002fb 76 16 1 0 0 is_stmt -0x0000053a: 00 DW_LNE_set_address (0x00000000000002fc) -0x00000541: 03 DW_LNS_advance_line (75) -0x00000543: 05 DW_LNS_set_column (27) -0x00000545: 01 DW_LNS_copy - 0x00000000000002fc 75 27 1 0 0 is_stmt +0x0000053a: 00 DW_LNE_set_address (0x0000000000000303) +0x00000541: 05 DW_LNS_set_column (27) +0x00000543: 06 DW_LNS_negate_stmt +0x00000544: 01 DW_LNS_copy + 0x0000000000000303 76 27 1 0 0 -0x00000546: 00 DW_LNE_set_address (0x0000000000000305) -0x0000054d: 03 DW_LNS_advance_line (76) -0x0000054f: 05 DW_LNS_set_column (16) -0x00000551: 01 DW_LNS_copy - 0x0000000000000305 76 16 1 0 0 is_stmt +0x00000545: 00 DW_LNE_set_address (0x0000000000000305) +0x0000054c: 05 DW_LNS_set_column (35) +0x0000054e: 01 DW_LNS_copy + 0x0000000000000305 76 35 1 0 0 -0x00000552: 00 DW_LNE_set_address (0x000000000000030d) -0x00000559: 05 DW_LNS_set_column (27) -0x0000055b: 06 DW_LNS_negate_stmt -0x0000055c: 01 DW_LNS_copy - 0x000000000000030d 76 27 1 0 0 +0x0000054f: 00 DW_LNE_set_address (0x000000000000030e) +0x00000556: 05 DW_LNS_set_column (27) +0x00000558: 01 DW_LNS_copy + 0x000000000000030e 76 27 1 0 0 -0x0000055d: 00 DW_LNE_set_address (0x000000000000030f) -0x00000564: 05 DW_LNS_set_column (35) -0x00000566: 01 DW_LNS_copy - 0x000000000000030f 76 35 1 0 0 +0x00000559: 00 DW_LNE_set_address (0x0000000000000313) +0x00000560: 05 DW_LNS_set_column (25) +0x00000562: 01 DW_LNS_copy + 0x0000000000000313 76 25 1 0 0 -0x00000567: 00 DW_LNE_set_address (0x0000000000000318) -0x0000056e: 05 DW_LNS_set_column (27) -0x00000570: 01 DW_LNS_copy - 0x0000000000000318 76 27 1 0 0 +0x00000563: 00 DW_LNE_set_address (0x0000000000000316) +0x0000056a: 03 DW_LNS_advance_line (75) +0x0000056c: 05 DW_LNS_set_column (27) +0x0000056e: 06 DW_LNS_negate_stmt +0x0000056f: 01 DW_LNS_copy + 0x0000000000000316 75 27 1 0 0 is_stmt -0x00000571: 00 DW_LNE_set_address (0x000000000000031d) -0x00000578: 05 DW_LNS_set_column (25) -0x0000057a: 01 DW_LNS_copy - 0x000000000000031d 76 25 1 0 0 +0x00000570: 00 DW_LNE_set_address (0x0000000000000323) +0x00000577: 03 DW_LNS_advance_line (77) +0x00000579: 05 DW_LNS_set_column (13) +0x0000057b: 01 DW_LNS_copy + 0x0000000000000323 77 13 1 0 0 is_stmt -0x0000057b: 00 DW_LNE_set_address (0x0000000000000320) -0x00000582: 03 DW_LNS_advance_line (75) -0x00000584: 05 DW_LNS_set_column (27) -0x00000586: 06 DW_LNS_negate_stmt -0x00000587: 01 DW_LNS_copy - 0x0000000000000320 75 27 1 0 0 is_stmt +0x0000057c: 00 DW_LNE_set_address (0x000000000000032b) +0x00000583: 05 DW_LNS_set_column (22) +0x00000585: 06 DW_LNS_negate_stmt +0x00000586: 01 DW_LNS_copy + 0x000000000000032b 77 22 1 0 0 -0x00000588: 00 DW_LNE_set_address (0x000000000000032d) -0x0000058f: 03 DW_LNS_advance_line (77) -0x00000591: 05 DW_LNS_set_column (13) +0x00000587: 00 DW_LNE_set_address (0x0000000000000330) +0x0000058e: 03 DW_LNS_advance_line (79) +0x00000590: 05 DW_LNS_set_column (16) +0x00000592: 06 DW_LNS_negate_stmt 0x00000593: 01 DW_LNS_copy - 0x000000000000032d 77 13 1 0 0 is_stmt + 0x0000000000000330 79 16 1 0 0 is_stmt -0x00000594: 00 DW_LNE_set_address (0x0000000000000335) -0x0000059b: 05 DW_LNS_set_column (22) +0x00000594: 00 DW_LNE_set_address (0x0000000000000338) +0x0000059b: 05 DW_LNS_set_column (14) 0x0000059d: 06 DW_LNS_negate_stmt 0x0000059e: 01 DW_LNS_copy - 0x0000000000000335 77 22 1 0 0 + 0x0000000000000338 79 14 1 0 0 -0x0000059f: 00 DW_LNE_set_address (0x000000000000033a) -0x000005a6: 03 DW_LNS_advance_line (79) -0x000005a8: 05 DW_LNS_set_column (16) -0x000005aa: 06 DW_LNS_negate_stmt -0x000005ab: 01 DW_LNS_copy - 0x000000000000033a 79 16 1 0 0 is_stmt +0x0000059f: 00 DW_LNE_set_address (0x0000000000000347) +0x000005a6: 05 DW_LNS_set_column (25) +0x000005a8: 01 DW_LNS_copy + 0x0000000000000347 79 25 1 0 0 -0x000005ac: 00 DW_LNE_set_address (0x0000000000000342) -0x000005b3: 05 DW_LNS_set_column (14) -0x000005b5: 06 DW_LNS_negate_stmt -0x000005b6: 01 DW_LNS_copy - 0x0000000000000342 79 14 1 0 0 +0x000005a9: 00 DW_LNE_set_address (0x000000000000034e) +0x000005b0: 03 DW_LNS_advance_line (81) +0x000005b2: 05 DW_LNS_set_column (11) +0x000005b4: 06 DW_LNS_negate_stmt +0x000005b5: 01 DW_LNS_copy + 0x000000000000034e 81 11 1 0 0 is_stmt -0x000005b7: 00 DW_LNE_set_address (0x0000000000000351) -0x000005be: 05 DW_LNS_set_column (25) -0x000005c0: 01 DW_LNS_copy - 0x0000000000000351 79 25 1 0 0 +0x000005b6: 00 DW_LNE_set_address (0x0000000000000353) +0x000005bd: 03 DW_LNS_advance_line (66) +0x000005bf: 05 DW_LNS_set_column (16) +0x000005c1: 01 DW_LNS_copy + 0x0000000000000353 66 16 1 0 0 is_stmt -0x000005c1: 00 DW_LNE_set_address (0x0000000000000358) -0x000005c8: 03 DW_LNS_advance_line (81) -0x000005ca: 05 DW_LNS_set_column (11) -0x000005cc: 06 DW_LNS_negate_stmt +0x000005c2: 00 DW_LNE_set_address (0x000000000000035a) +0x000005c9: 03 DW_LNS_advance_line (74) +0x000005cb: 05 DW_LNS_set_column (22) 0x000005cd: 01 DW_LNS_copy - 0x0000000000000358 81 11 1 0 0 is_stmt + 0x000000000000035a 74 22 1 0 0 is_stmt -0x000005ce: 00 DW_LNE_set_address (0x000000000000035d) -0x000005d5: 03 DW_LNS_advance_line (66) -0x000005d7: 05 DW_LNS_set_column (16) +0x000005ce: 00 DW_LNE_set_address (0x0000000000000368) +0x000005d5: 03 DW_LNS_advance_line (67) +0x000005d7: 05 DW_LNS_set_column (13) 0x000005d9: 01 DW_LNS_copy - 0x000000000000035d 66 16 1 0 0 is_stmt + 0x0000000000000368 67 13 1 0 0 is_stmt -0x000005da: 00 DW_LNE_set_address (0x0000000000000364) -0x000005e1: 03 DW_LNS_advance_line (74) -0x000005e3: 05 DW_LNS_set_column (22) -0x000005e5: 01 DW_LNS_copy - 0x0000000000000364 74 22 1 0 0 is_stmt +0x000005da: 00 DW_LNE_set_address (0x000000000000036c) +0x000005e1: 03 DW_LNS_advance_line (68) +0x000005e3: 01 DW_LNS_copy + 0x000000000000036c 68 13 1 0 0 is_stmt -0x000005e6: 00 DW_LNE_set_address (0x0000000000000372) -0x000005ed: 03 DW_LNS_advance_line (67) -0x000005ef: 05 DW_LNS_set_column (13) -0x000005f1: 01 DW_LNS_copy - 0x0000000000000372 67 13 1 0 0 is_stmt +0x000005e4: 00 DW_LNE_set_address (0x0000000000000370) +0x000005eb: 03 DW_LNS_advance_line (69) +0x000005ed: 01 DW_LNS_copy + 0x0000000000000370 69 13 1 0 0 is_stmt -0x000005f2: 00 DW_LNE_set_address (0x0000000000000376) -0x000005f9: 03 DW_LNS_advance_line (68) -0x000005fb: 01 DW_LNS_copy - 0x0000000000000376 68 13 1 0 0 is_stmt +0x000005ee: 00 DW_LNE_set_address (0x0000000000000374) +0x000005f5: 03 DW_LNS_advance_line (70) +0x000005f7: 01 DW_LNS_copy + 0x0000000000000374 70 13 1 0 0 is_stmt -0x000005fc: 00 DW_LNE_set_address (0x000000000000037a) -0x00000603: 03 DW_LNS_advance_line (69) -0x00000605: 01 DW_LNS_copy - 0x000000000000037a 69 13 1 0 0 is_stmt +0x000005f8: 00 DW_LNE_set_address (0x0000000000000377) +0x000005ff: 00 DW_LNE_end_sequence + 0x0000000000000377 70 13 1 0 0 is_stmt end_sequence +0x00000602: 00 DW_LNE_set_address (0x0000000000000379) +0x00000609: 03 DW_LNS_advance_line (152) +0x0000060c: 01 DW_LNS_copy + 0x0000000000000379 152 0 1 0 0 is_stmt -0x00000606: 00 DW_LNE_set_address (0x000000000000037e) -0x0000060d: 03 DW_LNS_advance_line (70) -0x0000060f: 01 DW_LNS_copy - 0x000000000000037e 70 13 1 0 0 is_stmt +0x0000060d: 00 DW_LNE_set_address (0x0000000000000395) +0x00000614: 03 DW_LNS_advance_line (153) +0x00000616: 05 DW_LNS_set_column (17) +0x00000618: 0a DW_LNS_set_prologue_end +0x00000619: 01 DW_LNS_copy + 0x0000000000000395 153 17 1 0 0 is_stmt prologue_end -0x00000610: 00 DW_LNE_set_address (0x0000000000000381) -0x00000617: 00 DW_LNE_end_sequence - 0x0000000000000381 70 13 1 0 0 is_stmt end_sequence -0x0000061a: 00 DW_LNE_set_address (0x0000000000000383) -0x00000621: 03 DW_LNS_advance_line (152) +0x0000061a: 00 DW_LNE_set_address (0x000000000000039c) +0x00000621: 05 DW_LNS_set_column (28) +0x00000623: 06 DW_LNS_negate_stmt 0x00000624: 01 DW_LNS_copy - 0x0000000000000383 152 0 1 0 0 is_stmt + 0x000000000000039c 153 28 1 0 0 -0x00000625: 00 DW_LNE_set_address (0x000000000000039f) -0x0000062c: 03 DW_LNS_advance_line (153) -0x0000062e: 05 DW_LNS_set_column (17) -0x00000630: 0a DW_LNS_set_prologue_end -0x00000631: 01 DW_LNS_copy - 0x000000000000039f 153 17 1 0 0 is_stmt prologue_end +0x00000625: 00 DW_LNE_set_address (0x00000000000003a1) +0x0000062c: 05 DW_LNS_set_column (23) +0x0000062e: 01 DW_LNS_copy + 0x00000000000003a1 153 23 1 0 0 -0x00000632: 00 DW_LNE_set_address (0x00000000000003a6) -0x00000639: 05 DW_LNS_set_column (28) -0x0000063b: 06 DW_LNS_negate_stmt -0x0000063c: 01 DW_LNS_copy - 0x00000000000003a6 153 28 1 0 0 +0x0000062f: 00 DW_LNE_set_address (0x00000000000003a7) +0x00000636: 03 DW_LNS_advance_line (155) +0x00000638: 05 DW_LNS_set_column (10) +0x0000063a: 06 DW_LNS_negate_stmt +0x0000063b: 01 DW_LNS_copy + 0x00000000000003a7 155 10 1 0 0 is_stmt -0x0000063d: 00 DW_LNE_set_address (0x00000000000003ab) -0x00000644: 05 DW_LNS_set_column (23) +0x0000063c: 00 DW_LNE_set_address (0x00000000000003a8) +0x00000643: 05 DW_LNS_set_column (8) +0x00000645: 06 DW_LNS_negate_stmt 0x00000646: 01 DW_LNS_copy - 0x00000000000003ab 153 23 1 0 0 + 0x00000000000003a8 155 8 1 0 0 -0x00000647: 00 DW_LNE_set_address (0x00000000000003b1) -0x0000064e: 03 DW_LNS_advance_line (155) -0x00000650: 05 DW_LNS_set_column (10) +0x00000647: 00 DW_LNE_set_address (0x00000000000003ab) +0x0000064e: 03 DW_LNS_advance_line (156) +0x00000650: 05 DW_LNS_set_column (7) 0x00000652: 06 DW_LNS_negate_stmt 0x00000653: 01 DW_LNS_copy - 0x00000000000003b1 155 10 1 0 0 is_stmt + 0x00000000000003ab 156 7 1 0 0 is_stmt -0x00000654: 00 DW_LNE_set_address (0x00000000000003b2) -0x0000065b: 05 DW_LNS_set_column (8) -0x0000065d: 06 DW_LNS_negate_stmt -0x0000065e: 01 DW_LNS_copy - 0x00000000000003b2 155 8 1 0 0 +0x00000654: 00 DW_LNE_set_address (0x00000000000003b8) +0x0000065b: 03 DW_LNS_advance_line (94) +0x0000065d: 05 DW_LNS_set_column (18) +0x0000065f: 01 DW_LNS_copy + 0x00000000000003b8 94 18 1 0 0 is_stmt -0x0000065f: 00 DW_LNE_set_address (0x00000000000003b5) -0x00000666: 03 DW_LNS_advance_line (156) -0x00000668: 05 DW_LNS_set_column (7) -0x0000066a: 06 DW_LNS_negate_stmt +0x00000660: 00 DW_LNE_set_address (0x00000000000003d2) +0x00000667: 03 DW_LNS_advance_line (95) +0x00000669: 05 DW_LNS_set_column (29) 0x0000066b: 01 DW_LNS_copy - 0x00000000000003b5 156 7 1 0 0 is_stmt + 0x00000000000003d2 95 29 1 0 0 is_stmt -0x0000066c: 00 DW_LNE_set_address (0x00000000000003c2) -0x00000673: 03 DW_LNS_advance_line (94) -0x00000675: 05 DW_LNS_set_column (18) +0x0000066c: 00 DW_LNE_set_address (0x00000000000003d4) +0x00000673: 03 DW_LNS_advance_line (98) +0x00000675: 05 DW_LNS_set_column (19) 0x00000677: 01 DW_LNS_copy - 0x00000000000003c2 94 18 1 0 0 is_stmt + 0x00000000000003d4 98 19 1 0 0 is_stmt -0x00000678: 00 DW_LNE_set_address (0x00000000000003dc) -0x0000067f: 03 DW_LNS_advance_line (95) -0x00000681: 05 DW_LNS_set_column (29) +0x00000678: 00 DW_LNE_set_address (0x00000000000003db) +0x0000067f: 03 DW_LNS_advance_line (97) +0x00000681: 05 DW_LNS_set_column (16) 0x00000683: 01 DW_LNS_copy - 0x00000000000003dc 95 29 1 0 0 is_stmt + 0x00000000000003db 97 16 1 0 0 is_stmt -0x00000684: 00 DW_LNE_set_address (0x00000000000003de) -0x0000068b: 03 DW_LNS_advance_line (98) -0x0000068d: 05 DW_LNS_set_column (19) -0x0000068f: 01 DW_LNS_copy - 0x00000000000003de 98 19 1 0 0 is_stmt +0x00000684: 00 DW_LNE_set_address (0x00000000000003e2) +0x0000068b: 03 DW_LNS_advance_line (96) +0x0000068d: 01 DW_LNS_copy + 0x00000000000003e2 96 16 1 0 0 is_stmt -0x00000690: 00 DW_LNE_set_address (0x00000000000003e5) -0x00000697: 03 DW_LNS_advance_line (97) -0x00000699: 05 DW_LNS_set_column (16) -0x0000069b: 01 DW_LNS_copy - 0x00000000000003e5 97 16 1 0 0 is_stmt +0x0000068e: 00 DW_LNE_set_address (0x00000000000003ed) +0x00000695: 03 DW_LNS_advance_line (94) +0x00000697: 05 DW_LNS_set_column (28) +0x00000699: 01 DW_LNS_copy + 0x00000000000003ed 94 28 1 0 0 is_stmt -0x0000069c: 00 DW_LNE_set_address (0x00000000000003ec) -0x000006a3: 03 DW_LNS_advance_line (96) -0x000006a5: 01 DW_LNS_copy - 0x00000000000003ec 96 16 1 0 0 is_stmt +0x0000069a: 00 DW_LNE_set_address (0x00000000000003f2) +0x000006a1: 05 DW_LNS_set_column (18) +0x000006a3: 06 DW_LNS_negate_stmt +0x000006a4: 01 DW_LNS_copy + 0x00000000000003f2 94 18 1 0 0 -0x000006a6: 00 DW_LNE_set_address (0x00000000000003f7) -0x000006ad: 03 DW_LNS_advance_line (94) -0x000006af: 05 DW_LNS_set_column (28) -0x000006b1: 01 DW_LNS_copy - 0x00000000000003f7 94 28 1 0 0 is_stmt +0x000006a5: 00 DW_LNE_set_address (0x00000000000003f7) +0x000006ac: 05 DW_LNS_set_column (4) +0x000006ae: 01 DW_LNS_copy + 0x00000000000003f7 94 4 1 0 0 -0x000006b2: 00 DW_LNE_set_address (0x00000000000003fc) -0x000006b9: 05 DW_LNS_set_column (18) -0x000006bb: 06 DW_LNS_negate_stmt -0x000006bc: 01 DW_LNS_copy - 0x00000000000003fc 94 18 1 0 0 +0x000006af: 00 DW_LNE_set_address (0x00000000000003ff) +0x000006b6: 03 DW_LNS_advance_line (102) +0x000006b8: 05 DW_LNS_set_column (27) +0x000006ba: 06 DW_LNS_negate_stmt +0x000006bb: 01 DW_LNS_copy + 0x00000000000003ff 102 27 1 0 0 is_stmt -0x000006bd: 00 DW_LNE_set_address (0x0000000000000401) -0x000006c4: 05 DW_LNS_set_column (4) +0x000006bc: 00 DW_LNE_set_address (0x0000000000000404) +0x000006c3: 05 DW_LNS_set_column (18) +0x000006c5: 06 DW_LNS_negate_stmt 0x000006c6: 01 DW_LNS_copy - 0x0000000000000401 94 4 1 0 0 + 0x0000000000000404 102 18 1 0 0 -0x000006c7: 00 DW_LNE_set_address (0x0000000000000409) -0x000006ce: 03 DW_LNS_advance_line (102) -0x000006d0: 05 DW_LNS_set_column (27) -0x000006d2: 06 DW_LNS_negate_stmt -0x000006d3: 01 DW_LNS_copy - 0x0000000000000409 102 27 1 0 0 is_stmt +0x000006c7: 00 DW_LNE_set_address (0x000000000000040a) +0x000006ce: 03 DW_LNS_advance_line (103) +0x000006d0: 06 DW_LNS_negate_stmt +0x000006d1: 01 DW_LNS_copy + 0x000000000000040a 103 18 1 0 0 is_stmt -0x000006d4: 00 DW_LNE_set_address (0x000000000000040e) -0x000006db: 05 DW_LNS_set_column (18) -0x000006dd: 06 DW_LNS_negate_stmt -0x000006de: 01 DW_LNS_copy - 0x000000000000040e 102 18 1 0 0 +0x000006d2: 00 DW_LNE_set_address (0x0000000000000416) +0x000006d9: 03 DW_LNS_advance_line (105) +0x000006db: 01 DW_LNS_copy + 0x0000000000000416 105 18 1 0 0 is_stmt -0x000006df: 00 DW_LNE_set_address (0x0000000000000414) -0x000006e6: 03 DW_LNS_advance_line (103) -0x000006e8: 06 DW_LNS_negate_stmt -0x000006e9: 01 DW_LNS_copy - 0x0000000000000414 103 18 1 0 0 is_stmt +0x000006dc: 00 DW_LNE_set_address (0x000000000000041f) +0x000006e3: 03 DW_LNS_advance_line (106) +0x000006e5: 05 DW_LNS_set_column (7) +0x000006e7: 01 DW_LNS_copy + 0x000000000000041f 106 7 1 0 0 is_stmt -0x000006ea: 00 DW_LNE_set_address (0x0000000000000420) -0x000006f1: 03 DW_LNS_advance_line (105) -0x000006f3: 01 DW_LNS_copy - 0x0000000000000420 105 18 1 0 0 is_stmt +0x000006e8: 00 DW_LNE_set_address (0x0000000000000427) +0x000006ef: 05 DW_LNS_set_column (16) +0x000006f1: 06 DW_LNS_negate_stmt +0x000006f2: 01 DW_LNS_copy + 0x0000000000000427 106 16 1 0 0 -0x000006f4: 00 DW_LNE_set_address (0x0000000000000429) -0x000006fb: 03 DW_LNS_advance_line (106) -0x000006fd: 05 DW_LNS_set_column (7) +0x000006f3: 00 DW_LNE_set_address (0x000000000000042c) +0x000006fa: 03 DW_LNS_advance_line (105) +0x000006fc: 05 DW_LNS_set_column (24) +0x000006fe: 06 DW_LNS_negate_stmt 0x000006ff: 01 DW_LNS_copy - 0x0000000000000429 106 7 1 0 0 is_stmt + 0x000000000000042c 105 24 1 0 0 is_stmt 0x00000700: 00 DW_LNE_set_address (0x0000000000000431) -0x00000707: 05 DW_LNS_set_column (16) +0x00000707: 05 DW_LNS_set_column (18) 0x00000709: 06 DW_LNS_negate_stmt 0x0000070a: 01 DW_LNS_copy - 0x0000000000000431 106 16 1 0 0 + 0x0000000000000431 105 18 1 0 0 -0x0000070b: 00 DW_LNE_set_address (0x0000000000000436) -0x00000712: 03 DW_LNS_advance_line (105) -0x00000714: 05 DW_LNS_set_column (24) +0x0000070b: 00 DW_LNE_set_address (0x0000000000000457) +0x00000712: 03 DW_LNS_advance_line (112) +0x00000714: 05 DW_LNS_set_column (13) 0x00000716: 06 DW_LNS_negate_stmt 0x00000717: 01 DW_LNS_copy - 0x0000000000000436 105 24 1 0 0 is_stmt + 0x0000000000000457 112 13 1 0 0 is_stmt -0x00000718: 00 DW_LNE_set_address (0x000000000000043b) -0x0000071f: 05 DW_LNS_set_column (18) +0x00000718: 00 DW_LNE_set_address (0x0000000000000459) +0x0000071f: 05 DW_LNS_set_column (26) 0x00000721: 06 DW_LNS_negate_stmt 0x00000722: 01 DW_LNS_copy - 0x000000000000043b 105 18 1 0 0 + 0x0000000000000459 112 26 1 0 0 -0x00000723: 00 DW_LNE_set_address (0x0000000000000461) -0x0000072a: 03 DW_LNS_advance_line (112) -0x0000072c: 05 DW_LNS_set_column (13) -0x0000072e: 06 DW_LNS_negate_stmt -0x0000072f: 01 DW_LNS_copy - 0x0000000000000461 112 13 1 0 0 is_stmt +0x00000723: 00 DW_LNE_set_address (0x0000000000000466) +0x0000072a: 05 DW_LNS_set_column (35) +0x0000072c: 01 DW_LNS_copy + 0x0000000000000466 112 35 1 0 0 -0x00000730: 00 DW_LNE_set_address (0x0000000000000463) -0x00000737: 05 DW_LNS_set_column (26) -0x00000739: 06 DW_LNS_negate_stmt -0x0000073a: 01 DW_LNS_copy - 0x0000000000000463 112 26 1 0 0 +0x0000072d: 00 DW_LNE_set_address (0x0000000000000467) +0x00000734: 05 DW_LNS_set_column (13) +0x00000736: 01 DW_LNS_copy + 0x0000000000000467 112 13 1 0 0 -0x0000073b: 00 DW_LNE_set_address (0x0000000000000470) -0x00000742: 05 DW_LNS_set_column (35) -0x00000744: 01 DW_LNS_copy - 0x0000000000000470 112 35 1 0 0 +0x00000737: 00 DW_LNE_set_address (0x0000000000000475) +0x0000073e: 03 DW_LNS_advance_line (111) +0x00000740: 05 DW_LNS_set_column (30) +0x00000742: 06 DW_LNS_negate_stmt +0x00000743: 01 DW_LNS_copy + 0x0000000000000475 111 30 1 0 0 is_stmt -0x00000745: 00 DW_LNE_set_address (0x0000000000000471) -0x0000074c: 05 DW_LNS_set_column (13) +0x00000744: 00 DW_LNE_set_address (0x000000000000047a) +0x0000074b: 05 DW_LNS_set_column (24) +0x0000074d: 06 DW_LNS_negate_stmt 0x0000074e: 01 DW_LNS_copy - 0x0000000000000471 112 13 1 0 0 + 0x000000000000047a 111 24 1 0 0 0x0000074f: 00 DW_LNE_set_address (0x000000000000047f) -0x00000756: 03 DW_LNS_advance_line (111) -0x00000758: 05 DW_LNS_set_column (30) -0x0000075a: 06 DW_LNS_negate_stmt -0x0000075b: 01 DW_LNS_copy - 0x000000000000047f 111 30 1 0 0 is_stmt +0x00000756: 05 DW_LNS_set_column (10) +0x00000758: 01 DW_LNS_copy + 0x000000000000047f 111 10 1 0 0 -0x0000075c: 00 DW_LNE_set_address (0x0000000000000484) -0x00000763: 05 DW_LNS_set_column (24) -0x00000765: 06 DW_LNS_negate_stmt -0x00000766: 01 DW_LNS_copy - 0x0000000000000484 111 24 1 0 0 +0x00000759: 00 DW_LNE_set_address (0x0000000000000484) +0x00000760: 03 DW_LNS_advance_line (113) +0x00000762: 06 DW_LNS_negate_stmt +0x00000763: 01 DW_LNS_copy + 0x0000000000000484 113 10 1 0 0 is_stmt -0x00000767: 00 DW_LNE_set_address (0x0000000000000489) -0x0000076e: 05 DW_LNS_set_column (10) -0x00000770: 01 DW_LNS_copy - 0x0000000000000489 111 10 1 0 0 +0x00000764: 00 DW_LNE_set_address (0x0000000000000487) +0x0000076b: 03 DW_LNS_advance_line (118) +0x0000076d: 05 DW_LNS_set_column (16) +0x0000076f: 01 DW_LNS_copy + 0x0000000000000487 118 16 1 0 0 is_stmt -0x00000771: 00 DW_LNE_set_address (0x000000000000048e) -0x00000778: 03 DW_LNS_advance_line (113) -0x0000077a: 06 DW_LNS_negate_stmt +0x00000770: 00 DW_LNE_set_address (0x0000000000000490) +0x00000777: 03 DW_LNS_advance_line (119) +0x00000779: 05 DW_LNS_set_column (10) 0x0000077b: 01 DW_LNS_copy - 0x000000000000048e 113 10 1 0 0 is_stmt + 0x0000000000000490 119 10 1 0 0 is_stmt -0x0000077c: 00 DW_LNE_set_address (0x0000000000000491) -0x00000783: 03 DW_LNS_advance_line (118) -0x00000785: 05 DW_LNS_set_column (16) -0x00000787: 01 DW_LNS_copy - 0x0000000000000491 118 16 1 0 0 is_stmt +0x0000077c: 00 DW_LNE_set_address (0x0000000000000492) +0x00000783: 05 DW_LNS_set_column (18) +0x00000785: 06 DW_LNS_negate_stmt +0x00000786: 01 DW_LNS_copy + 0x0000000000000492 119 18 1 0 0 -0x00000788: 00 DW_LNE_set_address (0x000000000000049a) -0x0000078f: 03 DW_LNS_advance_line (119) -0x00000791: 05 DW_LNS_set_column (10) -0x00000793: 01 DW_LNS_copy - 0x000000000000049a 119 10 1 0 0 is_stmt +0x00000787: 00 DW_LNE_set_address (0x000000000000049b) +0x0000078e: 05 DW_LNS_set_column (10) +0x00000790: 01 DW_LNS_copy + 0x000000000000049b 119 10 1 0 0 -0x00000794: 00 DW_LNE_set_address (0x000000000000049c) -0x0000079b: 05 DW_LNS_set_column (18) -0x0000079d: 06 DW_LNS_negate_stmt -0x0000079e: 01 DW_LNS_copy - 0x000000000000049c 119 18 1 0 0 +0x00000791: 00 DW_LNE_set_address (0x000000000000049d) +0x00000798: 05 DW_LNS_set_column (23) +0x0000079a: 01 DW_LNS_copy + 0x000000000000049d 119 23 1 0 0 -0x0000079f: 00 DW_LNE_set_address (0x00000000000004a5) -0x000007a6: 05 DW_LNS_set_column (10) -0x000007a8: 01 DW_LNS_copy - 0x00000000000004a5 119 10 1 0 0 +0x0000079b: 00 DW_LNE_set_address (0x00000000000004a2) +0x000007a2: 03 DW_LNS_advance_line (118) +0x000007a4: 05 DW_LNS_set_column (16) +0x000007a6: 06 DW_LNS_negate_stmt +0x000007a7: 01 DW_LNS_copy + 0x00000000000004a2 118 16 1 0 0 is_stmt -0x000007a9: 00 DW_LNE_set_address (0x00000000000004a7) -0x000007b0: 05 DW_LNS_set_column (23) -0x000007b2: 01 DW_LNS_copy - 0x00000000000004a7 119 23 1 0 0 +0x000007a8: 00 DW_LNE_set_address (0x00000000000004af) +0x000007af: 03 DW_LNS_advance_line (122) +0x000007b1: 01 DW_LNS_copy + 0x00000000000004af 122 16 1 0 0 is_stmt -0x000007b3: 00 DW_LNE_set_address (0x00000000000004ac) -0x000007ba: 03 DW_LNS_advance_line (118) -0x000007bc: 05 DW_LNS_set_column (16) -0x000007be: 06 DW_LNS_negate_stmt -0x000007bf: 01 DW_LNS_copy - 0x00000000000004ac 118 16 1 0 0 is_stmt +0x000007b2: 00 DW_LNE_set_address (0x00000000000004c3) +0x000007b9: 03 DW_LNS_advance_line (125) +0x000007bb: 05 DW_LNS_set_column (22) +0x000007bd: 01 DW_LNS_copy + 0x00000000000004c3 125 22 1 0 0 is_stmt -0x000007c0: 00 DW_LNE_set_address (0x00000000000004b9) -0x000007c7: 03 DW_LNS_advance_line (122) +0x000007be: 00 DW_LNE_set_address (0x00000000000004ca) +0x000007c5: 03 DW_LNS_advance_line (126) +0x000007c7: 05 DW_LNS_set_column (27) 0x000007c9: 01 DW_LNS_copy - 0x00000000000004b9 122 16 1 0 0 is_stmt + 0x00000000000004ca 126 27 1 0 0 is_stmt -0x000007ca: 00 DW_LNE_set_address (0x00000000000004cd) -0x000007d1: 03 DW_LNS_advance_line (125) -0x000007d3: 05 DW_LNS_set_column (22) +0x000007ca: 00 DW_LNE_set_address (0x00000000000004d3) +0x000007d1: 03 DW_LNS_advance_line (127) +0x000007d3: 05 DW_LNS_set_column (16) 0x000007d5: 01 DW_LNS_copy - 0x00000000000004cd 125 22 1 0 0 is_stmt + 0x00000000000004d3 127 16 1 0 0 is_stmt -0x000007d6: 00 DW_LNE_set_address (0x00000000000004d4) -0x000007dd: 03 DW_LNS_advance_line (126) -0x000007df: 05 DW_LNS_set_column (27) -0x000007e1: 01 DW_LNS_copy - 0x00000000000004d4 126 27 1 0 0 is_stmt +0x000007d6: 00 DW_LNE_set_address (0x00000000000004db) +0x000007dd: 05 DW_LNS_set_column (27) +0x000007df: 06 DW_LNS_negate_stmt +0x000007e0: 01 DW_LNS_copy + 0x00000000000004db 127 27 1 0 0 -0x000007e2: 00 DW_LNE_set_address (0x00000000000004dd) -0x000007e9: 03 DW_LNS_advance_line (127) -0x000007eb: 05 DW_LNS_set_column (16) -0x000007ed: 01 DW_LNS_copy - 0x00000000000004dd 127 16 1 0 0 is_stmt +0x000007e1: 00 DW_LNE_set_address (0x00000000000004dd) +0x000007e8: 05 DW_LNS_set_column (35) +0x000007ea: 01 DW_LNS_copy + 0x00000000000004dd 127 35 1 0 0 -0x000007ee: 00 DW_LNE_set_address (0x00000000000004e5) -0x000007f5: 05 DW_LNS_set_column (27) -0x000007f7: 06 DW_LNS_negate_stmt -0x000007f8: 01 DW_LNS_copy - 0x00000000000004e5 127 27 1 0 0 +0x000007eb: 00 DW_LNE_set_address (0x00000000000004e6) +0x000007f2: 05 DW_LNS_set_column (27) +0x000007f4: 01 DW_LNS_copy + 0x00000000000004e6 127 27 1 0 0 -0x000007f9: 00 DW_LNE_set_address (0x00000000000004e7) -0x00000800: 05 DW_LNS_set_column (35) -0x00000802: 01 DW_LNS_copy - 0x00000000000004e7 127 35 1 0 0 +0x000007f5: 00 DW_LNE_set_address (0x00000000000004eb) +0x000007fc: 05 DW_LNS_set_column (25) +0x000007fe: 01 DW_LNS_copy + 0x00000000000004eb 127 25 1 0 0 -0x00000803: 00 DW_LNE_set_address (0x00000000000004f0) -0x0000080a: 05 DW_LNS_set_column (27) -0x0000080c: 01 DW_LNS_copy - 0x00000000000004f0 127 27 1 0 0 +0x000007ff: 00 DW_LNE_set_address (0x00000000000004ee) +0x00000806: 03 DW_LNS_advance_line (126) +0x00000808: 05 DW_LNS_set_column (27) +0x0000080a: 06 DW_LNS_negate_stmt +0x0000080b: 01 DW_LNS_copy + 0x00000000000004ee 126 27 1 0 0 is_stmt -0x0000080d: 00 DW_LNE_set_address (0x00000000000004f5) -0x00000814: 05 DW_LNS_set_column (25) +0x0000080c: 00 DW_LNE_set_address (0x00000000000004f3) +0x00000813: 05 DW_LNS_set_column (13) +0x00000815: 06 DW_LNS_negate_stmt 0x00000816: 01 DW_LNS_copy - 0x00000000000004f5 127 25 1 0 0 + 0x00000000000004f3 126 13 1 0 0 -0x00000817: 00 DW_LNE_set_address (0x00000000000004f8) -0x0000081e: 03 DW_LNS_advance_line (126) -0x00000820: 05 DW_LNS_set_column (27) -0x00000822: 06 DW_LNS_negate_stmt -0x00000823: 01 DW_LNS_copy - 0x00000000000004f8 126 27 1 0 0 is_stmt +0x00000817: 00 DW_LNE_set_address (0x00000000000004fb) +0x0000081e: 03 DW_LNS_advance_line (128) +0x00000820: 06 DW_LNS_negate_stmt +0x00000821: 01 DW_LNS_copy + 0x00000000000004fb 128 13 1 0 0 is_stmt -0x00000824: 00 DW_LNE_set_address (0x00000000000004fd) -0x0000082b: 05 DW_LNS_set_column (13) -0x0000082d: 06 DW_LNS_negate_stmt -0x0000082e: 01 DW_LNS_copy - 0x00000000000004fd 126 13 1 0 0 +0x00000822: 00 DW_LNE_set_address (0x0000000000000503) +0x00000829: 05 DW_LNS_set_column (22) +0x0000082b: 06 DW_LNS_negate_stmt +0x0000082c: 01 DW_LNS_copy + 0x0000000000000503 128 22 1 0 0 -0x0000082f: 00 DW_LNE_set_address (0x0000000000000505) -0x00000836: 03 DW_LNS_advance_line (128) +0x0000082d: 00 DW_LNE_set_address (0x0000000000000508) +0x00000834: 03 DW_LNS_advance_line (130) +0x00000836: 05 DW_LNS_set_column (16) 0x00000838: 06 DW_LNS_negate_stmt 0x00000839: 01 DW_LNS_copy - 0x0000000000000505 128 13 1 0 0 is_stmt + 0x0000000000000508 130 16 1 0 0 is_stmt -0x0000083a: 00 DW_LNE_set_address (0x000000000000050d) -0x00000841: 05 DW_LNS_set_column (22) +0x0000083a: 00 DW_LNE_set_address (0x0000000000000510) +0x00000841: 05 DW_LNS_set_column (14) 0x00000843: 06 DW_LNS_negate_stmt 0x00000844: 01 DW_LNS_copy - 0x000000000000050d 128 22 1 0 0 + 0x0000000000000510 130 14 1 0 0 -0x00000845: 00 DW_LNE_set_address (0x0000000000000512) -0x0000084c: 03 DW_LNS_advance_line (130) -0x0000084e: 05 DW_LNS_set_column (16) -0x00000850: 06 DW_LNS_negate_stmt -0x00000851: 01 DW_LNS_copy - 0x0000000000000512 130 16 1 0 0 is_stmt +0x00000845: 00 DW_LNE_set_address (0x000000000000051f) +0x0000084c: 05 DW_LNS_set_column (25) +0x0000084e: 01 DW_LNS_copy + 0x000000000000051f 130 25 1 0 0 -0x00000852: 00 DW_LNE_set_address (0x000000000000051a) -0x00000859: 05 DW_LNS_set_column (14) -0x0000085b: 06 DW_LNS_negate_stmt -0x0000085c: 01 DW_LNS_copy - 0x000000000000051a 130 14 1 0 0 +0x0000084f: 00 DW_LNE_set_address (0x0000000000000526) +0x00000856: 03 DW_LNS_advance_line (133) +0x00000858: 05 DW_LNS_set_column (11) +0x0000085a: 06 DW_LNS_negate_stmt +0x0000085b: 01 DW_LNS_copy + 0x0000000000000526 133 11 1 0 0 is_stmt -0x0000085d: 00 DW_LNE_set_address (0x0000000000000529) -0x00000864: 05 DW_LNS_set_column (25) -0x00000866: 01 DW_LNS_copy - 0x0000000000000529 130 25 1 0 0 +0x0000085c: 00 DW_LNE_set_address (0x000000000000052b) +0x00000863: 03 DW_LNS_advance_line (122) +0x00000865: 05 DW_LNS_set_column (16) +0x00000867: 01 DW_LNS_copy + 0x000000000000052b 122 16 1 0 0 is_stmt -0x00000867: 00 DW_LNE_set_address (0x0000000000000530) -0x0000086e: 03 DW_LNS_advance_line (133) -0x00000870: 05 DW_LNS_set_column (11) -0x00000872: 06 DW_LNS_negate_stmt -0x00000873: 01 DW_LNS_copy - 0x0000000000000530 133 11 1 0 0 is_stmt +0x00000868: 00 DW_LNE_set_address (0x0000000000000530) +0x0000086f: 05 DW_LNS_set_column (14) +0x00000871: 06 DW_LNS_negate_stmt +0x00000872: 01 DW_LNS_copy + 0x0000000000000530 122 14 1 0 0 -0x00000874: 00 DW_LNE_set_address (0x0000000000000535) -0x0000087b: 03 DW_LNS_advance_line (122) -0x0000087d: 05 DW_LNS_set_column (16) +0x00000873: 00 DW_LNE_set_address (0x0000000000000536) +0x0000087a: 03 DW_LNS_advance_line (110) +0x0000087c: 05 DW_LNS_set_column (11) +0x0000087e: 06 DW_LNS_negate_stmt 0x0000087f: 01 DW_LNS_copy - 0x0000000000000535 122 16 1 0 0 is_stmt + 0x0000000000000536 110 11 1 0 0 is_stmt -0x00000880: 00 DW_LNE_set_address (0x000000000000053a) -0x00000887: 05 DW_LNS_set_column (14) -0x00000889: 06 DW_LNS_negate_stmt -0x0000088a: 01 DW_LNS_copy - 0x000000000000053a 122 14 1 0 0 +0x00000880: 00 DW_LNE_set_address (0x0000000000000542) +0x00000887: 03 DW_LNS_advance_line (113) +0x00000889: 05 DW_LNS_set_column (10) +0x0000088b: 01 DW_LNS_copy + 0x0000000000000542 113 10 1 0 0 is_stmt -0x0000088b: 00 DW_LNE_set_address (0x0000000000000540) -0x00000892: 03 DW_LNS_advance_line (110) -0x00000894: 05 DW_LNS_set_column (11) -0x00000896: 06 DW_LNS_negate_stmt +0x0000088c: 00 DW_LNE_set_address (0x0000000000000545) +0x00000893: 03 DW_LNS_advance_line (118) +0x00000895: 05 DW_LNS_set_column (16) 0x00000897: 01 DW_LNS_copy - 0x0000000000000540 110 11 1 0 0 is_stmt + 0x0000000000000545 118 16 1 0 0 is_stmt -0x00000898: 00 DW_LNE_set_address (0x000000000000054c) -0x0000089f: 03 DW_LNS_advance_line (113) +0x00000898: 00 DW_LNE_set_address (0x000000000000054e) +0x0000089f: 03 DW_LNS_advance_line (119) 0x000008a1: 05 DW_LNS_set_column (10) 0x000008a3: 01 DW_LNS_copy - 0x000000000000054c 113 10 1 0 0 is_stmt + 0x000000000000054e 119 10 1 0 0 is_stmt -0x000008a4: 00 DW_LNE_set_address (0x000000000000054f) -0x000008ab: 03 DW_LNS_advance_line (118) -0x000008ad: 05 DW_LNS_set_column (16) -0x000008af: 01 DW_LNS_copy - 0x000000000000054f 118 16 1 0 0 is_stmt +0x000008a4: 00 DW_LNE_set_address (0x0000000000000550) +0x000008ab: 05 DW_LNS_set_column (18) +0x000008ad: 06 DW_LNS_negate_stmt +0x000008ae: 01 DW_LNS_copy + 0x0000000000000550 119 18 1 0 0 -0x000008b0: 00 DW_LNE_set_address (0x0000000000000558) -0x000008b7: 03 DW_LNS_advance_line (119) -0x000008b9: 05 DW_LNS_set_column (10) -0x000008bb: 01 DW_LNS_copy - 0x0000000000000558 119 10 1 0 0 is_stmt +0x000008af: 00 DW_LNE_set_address (0x0000000000000559) +0x000008b6: 05 DW_LNS_set_column (10) +0x000008b8: 01 DW_LNS_copy + 0x0000000000000559 119 10 1 0 0 -0x000008bc: 00 DW_LNE_set_address (0x000000000000055a) -0x000008c3: 05 DW_LNS_set_column (18) -0x000008c5: 06 DW_LNS_negate_stmt -0x000008c6: 01 DW_LNS_copy - 0x000000000000055a 119 18 1 0 0 +0x000008b9: 00 DW_LNE_set_address (0x000000000000055b) +0x000008c0: 05 DW_LNS_set_column (23) +0x000008c2: 01 DW_LNS_copy + 0x000000000000055b 119 23 1 0 0 -0x000008c7: 00 DW_LNE_set_address (0x0000000000000563) -0x000008ce: 05 DW_LNS_set_column (10) -0x000008d0: 01 DW_LNS_copy - 0x0000000000000563 119 10 1 0 0 +0x000008c3: 00 DW_LNE_set_address (0x0000000000000560) +0x000008ca: 03 DW_LNS_advance_line (118) +0x000008cc: 05 DW_LNS_set_column (16) +0x000008ce: 06 DW_LNS_negate_stmt +0x000008cf: 01 DW_LNS_copy + 0x0000000000000560 118 16 1 0 0 is_stmt -0x000008d1: 00 DW_LNE_set_address (0x0000000000000565) -0x000008d8: 05 DW_LNS_set_column (23) -0x000008da: 01 DW_LNS_copy - 0x0000000000000565 119 23 1 0 0 +0x000008d0: 00 DW_LNE_set_address (0x000000000000056d) +0x000008d7: 03 DW_LNS_advance_line (122) +0x000008d9: 01 DW_LNS_copy + 0x000000000000056d 122 16 1 0 0 is_stmt -0x000008db: 00 DW_LNE_set_address (0x000000000000056a) -0x000008e2: 03 DW_LNS_advance_line (118) -0x000008e4: 05 DW_LNS_set_column (16) -0x000008e6: 06 DW_LNS_negate_stmt -0x000008e7: 01 DW_LNS_copy - 0x000000000000056a 118 16 1 0 0 is_stmt +0x000008da: 00 DW_LNE_set_address (0x0000000000000572) +0x000008e1: 05 DW_LNS_set_column (14) +0x000008e3: 06 DW_LNS_negate_stmt +0x000008e4: 01 DW_LNS_copy + 0x0000000000000572 122 14 1 0 0 -0x000008e8: 00 DW_LNE_set_address (0x0000000000000577) -0x000008ef: 03 DW_LNS_advance_line (122) +0x000008e5: 00 DW_LNE_set_address (0x000000000000057b) +0x000008ec: 03 DW_LNS_advance_line (125) +0x000008ee: 05 DW_LNS_set_column (22) +0x000008f0: 06 DW_LNS_negate_stmt 0x000008f1: 01 DW_LNS_copy - 0x0000000000000577 122 16 1 0 0 is_stmt + 0x000000000000057b 125 22 1 0 0 is_stmt -0x000008f2: 00 DW_LNE_set_address (0x000000000000057c) -0x000008f9: 05 DW_LNS_set_column (14) -0x000008fb: 06 DW_LNS_negate_stmt -0x000008fc: 01 DW_LNS_copy - 0x000000000000057c 122 14 1 0 0 +0x000008f2: 00 DW_LNE_set_address (0x0000000000000588) +0x000008f9: 03 DW_LNS_advance_line (126) +0x000008fb: 05 DW_LNS_set_column (27) +0x000008fd: 01 DW_LNS_copy + 0x0000000000000588 126 27 1 0 0 is_stmt -0x000008fd: 00 DW_LNE_set_address (0x0000000000000585) -0x00000904: 03 DW_LNS_advance_line (125) -0x00000906: 05 DW_LNS_set_column (22) -0x00000908: 06 DW_LNS_negate_stmt +0x000008fe: 00 DW_LNE_set_address (0x0000000000000591) +0x00000905: 03 DW_LNS_advance_line (127) +0x00000907: 05 DW_LNS_set_column (16) 0x00000909: 01 DW_LNS_copy - 0x0000000000000585 125 22 1 0 0 is_stmt + 0x0000000000000591 127 16 1 0 0 is_stmt -0x0000090a: 00 DW_LNE_set_address (0x0000000000000592) -0x00000911: 03 DW_LNS_advance_line (126) -0x00000913: 05 DW_LNS_set_column (27) -0x00000915: 01 DW_LNS_copy - 0x0000000000000592 126 27 1 0 0 is_stmt +0x0000090a: 00 DW_LNE_set_address (0x0000000000000599) +0x00000911: 05 DW_LNS_set_column (27) +0x00000913: 06 DW_LNS_negate_stmt +0x00000914: 01 DW_LNS_copy + 0x0000000000000599 127 27 1 0 0 -0x00000916: 00 DW_LNE_set_address (0x000000000000059b) -0x0000091d: 03 DW_LNS_advance_line (127) -0x0000091f: 05 DW_LNS_set_column (16) -0x00000921: 01 DW_LNS_copy - 0x000000000000059b 127 16 1 0 0 is_stmt +0x00000915: 00 DW_LNE_set_address (0x000000000000059b) +0x0000091c: 05 DW_LNS_set_column (35) +0x0000091e: 01 DW_LNS_copy + 0x000000000000059b 127 35 1 0 0 -0x00000922: 00 DW_LNE_set_address (0x00000000000005a3) -0x00000929: 05 DW_LNS_set_column (27) -0x0000092b: 06 DW_LNS_negate_stmt -0x0000092c: 01 DW_LNS_copy - 0x00000000000005a3 127 27 1 0 0 +0x0000091f: 00 DW_LNE_set_address (0x00000000000005a4) +0x00000926: 05 DW_LNS_set_column (27) +0x00000928: 01 DW_LNS_copy + 0x00000000000005a4 127 27 1 0 0 -0x0000092d: 00 DW_LNE_set_address (0x00000000000005a5) -0x00000934: 05 DW_LNS_set_column (35) -0x00000936: 01 DW_LNS_copy - 0x00000000000005a5 127 35 1 0 0 +0x00000929: 00 DW_LNE_set_address (0x00000000000005a9) +0x00000930: 05 DW_LNS_set_column (25) +0x00000932: 01 DW_LNS_copy + 0x00000000000005a9 127 25 1 0 0 -0x00000937: 00 DW_LNE_set_address (0x00000000000005ae) -0x0000093e: 05 DW_LNS_set_column (27) -0x00000940: 01 DW_LNS_copy - 0x00000000000005ae 127 27 1 0 0 +0x00000933: 00 DW_LNE_set_address (0x00000000000005ac) +0x0000093a: 03 DW_LNS_advance_line (126) +0x0000093c: 05 DW_LNS_set_column (27) +0x0000093e: 06 DW_LNS_negate_stmt +0x0000093f: 01 DW_LNS_copy + 0x00000000000005ac 126 27 1 0 0 is_stmt -0x00000941: 00 DW_LNE_set_address (0x00000000000005b3) -0x00000948: 05 DW_LNS_set_column (25) +0x00000940: 00 DW_LNE_set_address (0x00000000000005b1) +0x00000947: 05 DW_LNS_set_column (13) +0x00000949: 06 DW_LNS_negate_stmt 0x0000094a: 01 DW_LNS_copy - 0x00000000000005b3 127 25 1 0 0 + 0x00000000000005b1 126 13 1 0 0 -0x0000094b: 00 DW_LNE_set_address (0x00000000000005b6) -0x00000952: 03 DW_LNS_advance_line (126) -0x00000954: 05 DW_LNS_set_column (27) -0x00000956: 06 DW_LNS_negate_stmt -0x00000957: 01 DW_LNS_copy - 0x00000000000005b6 126 27 1 0 0 is_stmt +0x0000094b: 00 DW_LNE_set_address (0x00000000000005b9) +0x00000952: 03 DW_LNS_advance_line (128) +0x00000954: 06 DW_LNS_negate_stmt +0x00000955: 01 DW_LNS_copy + 0x00000000000005b9 128 13 1 0 0 is_stmt -0x00000958: 00 DW_LNE_set_address (0x00000000000005bb) -0x0000095f: 05 DW_LNS_set_column (13) -0x00000961: 06 DW_LNS_negate_stmt -0x00000962: 01 DW_LNS_copy - 0x00000000000005bb 126 13 1 0 0 +0x00000956: 00 DW_LNE_set_address (0x00000000000005c1) +0x0000095d: 05 DW_LNS_set_column (22) +0x0000095f: 06 DW_LNS_negate_stmt +0x00000960: 01 DW_LNS_copy + 0x00000000000005c1 128 22 1 0 0 -0x00000963: 00 DW_LNE_set_address (0x00000000000005c3) -0x0000096a: 03 DW_LNS_advance_line (128) +0x00000961: 00 DW_LNE_set_address (0x00000000000005c6) +0x00000968: 03 DW_LNS_advance_line (130) +0x0000096a: 05 DW_LNS_set_column (16) 0x0000096c: 06 DW_LNS_negate_stmt 0x0000096d: 01 DW_LNS_copy - 0x00000000000005c3 128 13 1 0 0 is_stmt + 0x00000000000005c6 130 16 1 0 0 is_stmt -0x0000096e: 00 DW_LNE_set_address (0x00000000000005cb) -0x00000975: 05 DW_LNS_set_column (22) +0x0000096e: 00 DW_LNE_set_address (0x00000000000005ce) +0x00000975: 05 DW_LNS_set_column (14) 0x00000977: 06 DW_LNS_negate_stmt 0x00000978: 01 DW_LNS_copy - 0x00000000000005cb 128 22 1 0 0 + 0x00000000000005ce 130 14 1 0 0 -0x00000979: 00 DW_LNE_set_address (0x00000000000005d0) -0x00000980: 03 DW_LNS_advance_line (130) -0x00000982: 05 DW_LNS_set_column (16) -0x00000984: 06 DW_LNS_negate_stmt -0x00000985: 01 DW_LNS_copy - 0x00000000000005d0 130 16 1 0 0 is_stmt +0x00000979: 00 DW_LNE_set_address (0x00000000000005dd) +0x00000980: 05 DW_LNS_set_column (25) +0x00000982: 01 DW_LNS_copy + 0x00000000000005dd 130 25 1 0 0 -0x00000986: 00 DW_LNE_set_address (0x00000000000005d8) -0x0000098d: 05 DW_LNS_set_column (14) -0x0000098f: 06 DW_LNS_negate_stmt -0x00000990: 01 DW_LNS_copy - 0x00000000000005d8 130 14 1 0 0 +0x00000983: 00 DW_LNE_set_address (0x00000000000005e4) +0x0000098a: 03 DW_LNS_advance_line (133) +0x0000098c: 05 DW_LNS_set_column (11) +0x0000098e: 06 DW_LNS_negate_stmt +0x0000098f: 01 DW_LNS_copy + 0x00000000000005e4 133 11 1 0 0 is_stmt -0x00000991: 00 DW_LNE_set_address (0x00000000000005e7) -0x00000998: 05 DW_LNS_set_column (25) -0x0000099a: 01 DW_LNS_copy - 0x00000000000005e7 130 25 1 0 0 +0x00000990: 00 DW_LNE_set_address (0x00000000000005e9) +0x00000997: 03 DW_LNS_advance_line (122) +0x00000999: 05 DW_LNS_set_column (16) +0x0000099b: 01 DW_LNS_copy + 0x00000000000005e9 122 16 1 0 0 is_stmt -0x0000099b: 00 DW_LNE_set_address (0x00000000000005ee) -0x000009a2: 03 DW_LNS_advance_line (133) -0x000009a4: 05 DW_LNS_set_column (11) -0x000009a6: 06 DW_LNS_negate_stmt -0x000009a7: 01 DW_LNS_copy - 0x00000000000005ee 133 11 1 0 0 is_stmt +0x0000099c: 00 DW_LNE_set_address (0x00000000000005ee) +0x000009a3: 05 DW_LNS_set_column (14) +0x000009a5: 06 DW_LNS_negate_stmt +0x000009a6: 01 DW_LNS_copy + 0x00000000000005ee 122 14 1 0 0 -0x000009a8: 00 DW_LNE_set_address (0x00000000000005f3) -0x000009af: 03 DW_LNS_advance_line (122) -0x000009b1: 05 DW_LNS_set_column (16) +0x000009a7: 00 DW_LNE_set_address (0x00000000000005f4) +0x000009ae: 03 DW_LNS_advance_line (110) +0x000009b0: 05 DW_LNS_set_column (11) +0x000009b2: 06 DW_LNS_negate_stmt 0x000009b3: 01 DW_LNS_copy - 0x00000000000005f3 122 16 1 0 0 is_stmt + 0x00000000000005f4 110 11 1 0 0 is_stmt -0x000009b4: 00 DW_LNE_set_address (0x00000000000005f8) -0x000009bb: 05 DW_LNS_set_column (14) -0x000009bd: 06 DW_LNS_negate_stmt -0x000009be: 01 DW_LNS_copy - 0x00000000000005f8 122 14 1 0 0 +0x000009b4: 00 DW_LNE_set_address (0x00000000000005fa) +0x000009bb: 03 DW_LNS_advance_line (138) +0x000009bd: 05 DW_LNS_set_column (4) +0x000009bf: 01 DW_LNS_copy + 0x00000000000005fa 138 4 1 0 0 is_stmt -0x000009bf: 00 DW_LNE_set_address (0x00000000000005fe) -0x000009c6: 03 DW_LNS_advance_line (110) -0x000009c8: 05 DW_LNS_set_column (11) -0x000009ca: 06 DW_LNS_negate_stmt -0x000009cb: 01 DW_LNS_copy - 0x00000000000005fe 110 11 1 0 0 is_stmt +0x000009c0: 00 DW_LNE_set_address (0x00000000000005fe) +0x000009c7: 03 DW_LNS_advance_line (139) +0x000009c9: 01 DW_LNS_copy + 0x00000000000005fe 139 4 1 0 0 is_stmt -0x000009cc: 00 DW_LNE_set_address (0x0000000000000604) -0x000009d3: 03 DW_LNS_advance_line (138) -0x000009d5: 05 DW_LNS_set_column (4) -0x000009d7: 01 DW_LNS_copy - 0x0000000000000604 138 4 1 0 0 is_stmt +0x000009ca: 00 DW_LNE_set_address (0x000000000000060e) +0x000009d1: 03 DW_LNS_advance_line (142) +0x000009d3: 05 DW_LNS_set_column (20) +0x000009d5: 01 DW_LNS_copy + 0x000000000000060e 142 20 1 0 0 is_stmt -0x000009d8: 00 DW_LNE_set_address (0x0000000000000608) -0x000009df: 03 DW_LNS_advance_line (139) -0x000009e1: 01 DW_LNS_copy - 0x0000000000000608 139 4 1 0 0 is_stmt +0x000009d6: 00 DW_LNE_set_address (0x0000000000000616) +0x000009dd: 03 DW_LNS_advance_line (146) +0x000009df: 01 DW_LNS_copy + 0x0000000000000616 146 20 1 0 0 is_stmt -0x000009e2: 00 DW_LNE_set_address (0x0000000000000618) -0x000009e9: 03 DW_LNS_advance_line (142) -0x000009eb: 05 DW_LNS_set_column (20) -0x000009ed: 01 DW_LNS_copy - 0x0000000000000618 142 20 1 0 0 is_stmt +0x000009e0: 00 DW_LNE_set_address (0x000000000000061d) +0x000009e7: 03 DW_LNS_advance_line (147) +0x000009e9: 05 DW_LNS_set_column (7) +0x000009eb: 01 DW_LNS_copy + 0x000000000000061d 147 7 1 0 0 is_stmt -0x000009ee: 00 DW_LNE_set_address (0x0000000000000620) -0x000009f5: 03 DW_LNS_advance_line (146) +0x000009ec: 00 DW_LNE_set_address (0x0000000000000621) +0x000009f3: 03 DW_LNS_advance_line (143) +0x000009f5: 05 DW_LNS_set_column (11) 0x000009f7: 01 DW_LNS_copy - 0x0000000000000620 146 20 1 0 0 is_stmt - - -0x000009f8: 00 DW_LNE_set_address (0x0000000000000627) -0x000009ff: 03 DW_LNS_advance_line (147) -0x00000a01: 05 DW_LNS_set_column (7) -0x00000a03: 01 DW_LNS_copy - 0x0000000000000627 147 7 1 0 0 is_stmt - + 0x0000000000000621 143 11 1 0 0 is_stmt -0x00000a04: 00 DW_LNE_set_address (0x000000000000062b) -0x00000a0b: 03 DW_LNS_advance_line (143) -0x00000a0d: 05 DW_LNS_set_column (11) -0x00000a0f: 01 DW_LNS_copy - 0x000000000000062b 143 11 1 0 0 is_stmt +0x000009f8: 00 DW_LNE_set_address (0x0000000000000625) +0x000009ff: 05 DW_LNS_set_column (20) +0x00000a01: 06 DW_LNS_negate_stmt +0x00000a02: 01 DW_LNS_copy + 0x0000000000000625 143 20 1 0 0 -0x00000a10: 00 DW_LNE_set_address (0x000000000000062f) -0x00000a17: 05 DW_LNS_set_column (20) -0x00000a19: 06 DW_LNS_negate_stmt -0x00000a1a: 01 DW_LNS_copy - 0x000000000000062f 143 20 1 0 0 +0x00000a03: 00 DW_LNE_set_address (0x000000000000062a) +0x00000a0a: 05 DW_LNS_set_column (11) +0x00000a0c: 01 DW_LNS_copy + 0x000000000000062a 143 11 1 0 0 -0x00000a1b: 00 DW_LNE_set_address (0x0000000000000634) -0x00000a22: 05 DW_LNS_set_column (11) -0x00000a24: 01 DW_LNS_copy - 0x0000000000000634 143 11 1 0 0 +0x00000a0d: 00 DW_LNE_set_address (0x0000000000000631) +0x00000a14: 03 DW_LNS_advance_line (141) +0x00000a16: 05 DW_LNS_set_column (4) +0x00000a18: 06 DW_LNS_negate_stmt +0x00000a19: 01 DW_LNS_copy + 0x0000000000000631 141 4 1 0 0 is_stmt -0x00000a25: 00 DW_LNE_set_address (0x000000000000063b) -0x00000a2c: 03 DW_LNS_advance_line (141) -0x00000a2e: 05 DW_LNS_set_column (4) -0x00000a30: 06 DW_LNS_negate_stmt -0x00000a31: 01 DW_LNS_copy - 0x000000000000063b 141 4 1 0 0 is_stmt +0x00000a1a: 00 DW_LNE_set_address (0x0000000000000637) +0x00000a21: 03 DW_LNS_advance_line (159) +0x00000a23: 01 DW_LNS_copy + 0x0000000000000637 159 4 1 0 0 is_stmt -0x00000a32: 00 DW_LNE_set_address (0x0000000000000641) -0x00000a39: 03 DW_LNS_advance_line (159) -0x00000a3b: 01 DW_LNS_copy - 0x0000000000000641 159 4 1 0 0 is_stmt +0x00000a24: 00 DW_LNE_set_address (0x000000000000064e) +0x00000a2b: 03 DW_LNS_advance_line (161) +0x00000a2d: 05 DW_LNS_set_column (1) +0x00000a2f: 01 DW_LNS_copy + 0x000000000000064e 161 1 1 0 0 is_stmt -0x00000a3c: 00 DW_LNE_set_address (0x0000000000000658) -0x00000a43: 03 DW_LNS_advance_line (161) -0x00000a45: 05 DW_LNS_set_column (1) -0x00000a47: 01 DW_LNS_copy - 0x0000000000000658 161 1 1 0 0 is_stmt - -0x00000a48: 00 DW_LNE_set_address (0x0000000000000662) -0x00000a4f: 00 DW_LNE_end_sequence - 0x0000000000000662 161 1 1 0 0 is_stmt end_sequence +0x00000a30: 00 DW_LNE_set_address (0x0000000000000658) +0x00000a37: 00 DW_LNE_end_sequence + 0x0000000000000658 161 1 1 0 0 is_stmt end_sequence .debug_str contents: @@ -4660,16 +4646,16 @@ file_names[ 4]: 0x000001ad: "char" .debug_ranges contents: -00000000 0000017f 000001bd -00000000 000001e7 000001f0 -00000000 000002fc 0000033a -00000000 00000364 0000036d +00000000 00000176 000001b4 +00000000 000001de 000001e7 +00000000 000002f2 00000330 +00000000 0000035a 00000363 00000000 -00000028 000004cd 00000512 -00000028 00000585 000005d0 +00000028 000004c3 00000508 +00000028 0000057b 000005c6 00000028 -00000040 00000006 00000381 -00000040 00000383 00000662 +00000040 00000006 00000377 +00000040 00000379 00000658 00000040 (module (type $0 (func (param i32) (result i32))) @@ -4750,699 +4736,686 @@ file_names[ 4]: (local.get $12) ) ) - ;; code offset: 0x43 - 0x372 - (block $block2 - ;; code offset: 0x45 - 0x21c - (block $block - ;; code offset: 0x4c - 0x1f5 - (if - ;; code offset: 0x4b - 0x4c - (i32.gt_s - ;; code offset: 0x47 - 0x49 - (local.get $2) - ;; code offset: 0x49 - 0x4b - (i32.const 0) - ) - (then - ;; code offset: 0x4e - 0x6a - (loop $label - ;; code offset: 0x5a - 0x5d - (i32.store - ;; code offset: 0x57 - 0x58 - (i32.add + ;; code offset: 0x43 - 0x368 + (block $block1 + ;; code offset: 0x4a - 0x1ec + (if + ;; code offset: 0x49 - 0x4a + (i32.gt_s + ;; code offset: 0x45 - 0x47 + (local.get $2) + ;; code offset: 0x47 - 0x49 + (i32.const 0) + ) + (then + ;; code offset: 0x4c - 0x68 + (loop $label + ;; code offset: 0x58 - 0x5b + (i32.store + ;; code offset: 0x55 - 0x56 + (i32.add + ;; code offset: 0x4e - 0x50 + (local.get $3) + ;; code offset: 0x54 - 0x55 + (i32.shl ;; code offset: 0x50 - 0x52 - (local.get $3) - ;; code offset: 0x56 - 0x57 - (i32.shl - ;; code offset: 0x52 - 0x54 - (local.get $1) - ;; code offset: 0x54 - 0x56 - (i32.const 2) - ) + (local.get $1) + ;; code offset: 0x52 - 0x54 + (i32.const 2) ) - ;; code offset: 0x58 - 0x5a - (local.get $1) ) - ;; code offset: 0x67 - 0x69 - (br_if $label - ;; code offset: 0x66 - 0x67 - (i32.ne - ;; code offset: 0x62 - 0x64 - (local.tee $1 - ;; code offset: 0x61 - 0x62 - (i32.add - ;; code offset: 0x5d - 0x5f - (local.get $1) - ;; code offset: 0x5f - 0x61 - (i32.const 1) - ) + ;; code offset: 0x56 - 0x58 + (local.get $1) + ) + ;; code offset: 0x65 - 0x67 + (br_if $label + ;; code offset: 0x64 - 0x65 + (i32.ne + ;; code offset: 0x60 - 0x62 + (local.tee $1 + ;; code offset: 0x5f - 0x60 + (i32.add + ;; code offset: 0x5b - 0x5d + (local.get $1) + ;; code offset: 0x5d - 0x5f + (i32.const 1) ) - ;; code offset: 0x64 - 0x66 - (local.get $2) ) + ;; code offset: 0x62 - 0x64 + (local.get $2) ) ) - ;; code offset: 0x7e - 0x81 - (i32.store - ;; code offset: 0x76 - 0x77 - (i32.add - ;; code offset: 0x6a - 0x6c - (local.get $3) - ;; code offset: 0x75 - 0x76 - (i32.shl - ;; code offset: 0x71 - 0x73 - (local.tee $1 - ;; code offset: 0x6e - 0x71 - (i32.load - ;; code offset: 0x6c - 0x6e - (local.get $0) - ) + ) + ;; code offset: 0x7c - 0x7f + (i32.store + ;; code offset: 0x74 - 0x75 + (i32.add + ;; code offset: 0x68 - 0x6a + (local.get $3) + ;; code offset: 0x73 - 0x74 + (i32.shl + ;; code offset: 0x6f - 0x71 + (local.tee $1 + ;; code offset: 0x6c - 0x6f + (i32.load + ;; code offset: 0x6a - 0x6c + (local.get $0) ) - ;; code offset: 0x73 - 0x75 - (i32.const 2) ) + ;; code offset: 0x71 - 0x73 + (i32.const 2) ) - ;; code offset: 0x7c - 0x7e - (local.tee $4 - ;; code offset: 0x7b - 0x7c - (i32.sub - ;; code offset: 0x77 - 0x79 - (local.get $2) - ;; code offset: 0x79 - 0x7b - (i32.const 1) - ) + ) + ;; code offset: 0x7a - 0x7c + (local.tee $4 + ;; code offset: 0x79 - 0x7a + (i32.sub + ;; code offset: 0x75 - 0x77 + (local.get $2) + ;; code offset: 0x77 - 0x79 + (i32.const 1) ) ) - ;; code offset: 0x8d - 0x90 - (i32.store - ;; code offset: 0x89 - 0x8b - (local.tee $13 - ;; code offset: 0x88 - 0x89 - (i32.add + ) + ;; code offset: 0x8b - 0x8e + (i32.store + ;; code offset: 0x87 - 0x89 + (local.tee $13 + ;; code offset: 0x86 - 0x87 + (i32.add + ;; code offset: 0x7f - 0x81 + (local.get $3) + ;; code offset: 0x85 - 0x86 + (i32.shl ;; code offset: 0x81 - 0x83 - (local.get $3) - ;; code offset: 0x87 - 0x88 - (i32.shl - ;; code offset: 0x83 - 0x85 - (local.get $4) - ;; code offset: 0x85 - 0x87 - (i32.const 2) - ) + (local.get $4) + ;; code offset: 0x83 - 0x85 + (i32.const 2) ) ) - ;; code offset: 0x8b - 0x8d - (local.get $1) ) - ;; code offset: 0x95 - 0x97 - (br_if $block + ;; code offset: 0x89 - 0x8b + (local.get $1) + ) + ;; code offset: 0x8e - 0x1ea + (loop $label5 + ;; code offset: 0x95 - 0xb8 + (if ;; code offset: 0x94 - 0x95 - (i32.le_s + (i32.gt_s ;; code offset: 0x90 - 0x92 (local.get $2) ;; code offset: 0x92 - 0x94 - (i32.const 0) + (i32.const 1) ) - ) - ;; code offset: 0x97 - 0x1f3 - (loop $label5 - ;; code offset: 0x9e - 0xc1 - (if - ;; code offset: 0x9d - 0x9e - (i32.gt_s - ;; code offset: 0x99 - 0x9b - (local.get $2) - ;; code offset: 0x9b - 0x9d - (i32.const 1) - ) - (then - ;; code offset: 0xa0 - 0xc0 - (loop $label1 - ;; code offset: 0xb1 - 0xb4 - (i32.store - ;; code offset: 0xae - 0xaf - (i32.add - ;; code offset: 0xa2 - 0xa4 - (local.get $9) - ;; code offset: 0xad - 0xae - (i32.shl - ;; code offset: 0xa9 - 0xab - (local.tee $1 - ;; code offset: 0xa8 - 0xa9 - (i32.sub - ;; code offset: 0xa4 - 0xa6 - (local.get $2) - ;; code offset: 0xa6 - 0xa8 - (i32.const 1) - ) - ) - ;; code offset: 0xab - 0xad - (i32.const 2) - ) - ) - ;; code offset: 0xaf - 0xb1 - (local.get $2) - ) - ;; code offset: 0xbd - 0xbf - (br_if $label1 - (block (result i32) - (local.set $scratch - ;; code offset: 0xb8 - 0xb9 - (i32.gt_s - ;; code offset: 0xb4 - 0xb6 + (then + ;; code offset: 0x97 - 0xb7 + (loop $label1 + ;; code offset: 0xa8 - 0xab + (i32.store + ;; code offset: 0xa5 - 0xa6 + (i32.add + ;; code offset: 0x99 - 0x9b + (local.get $9) + ;; code offset: 0xa4 - 0xa5 + (i32.shl + ;; code offset: 0xa0 - 0xa2 + (local.tee $1 + ;; code offset: 0x9f - 0xa0 + (i32.sub + ;; code offset: 0x9b - 0x9d (local.get $2) - ;; code offset: 0xb6 - 0xb8 - (i32.const 2) + ;; code offset: 0x9d - 0x9f + (i32.const 1) ) ) - ;; code offset: 0xbb - 0xbd - (local.set $2 - ;; code offset: 0xb9 - 0xbb - (local.get $1) - ) - (local.get $scratch) + ;; code offset: 0xa2 - 0xa4 + (i32.const 2) ) ) + ;; code offset: 0xa6 - 0xa8 + (local.get $2) ) - ) - ) - ;; code offset: 0xc1 - 0x172 - (block $block1 - ;; code offset: 0xcb - 0xcd - (br_if $block1 - ;; code offset: 0xca - 0xcb - (i32.eqz - ;; code offset: 0xc8 - 0xca - (local.tee $10 - ;; code offset: 0xc5 - 0xc8 - (i32.load - ;; code offset: 0xc3 - 0xc5 - (local.get $3) + ;; code offset: 0xb4 - 0xb6 + (br_if $label1 + (block (result i32) + (local.set $scratch + ;; code offset: 0xaf - 0xb0 + (i32.gt_s + ;; code offset: 0xab - 0xad + (local.get $2) + ;; code offset: 0xad - 0xaf + (i32.const 2) + ) ) + ;; code offset: 0xb2 - 0xb4 + (local.set $2 + ;; code offset: 0xb0 - 0xb2 + (local.get $1) + ) + (local.get $scratch) ) ) ) - ;; code offset: 0xd5 - 0xd7 - (br_if $block1 - ;; code offset: 0xd4 - 0xd5 - (i32.eq - ;; code offset: 0xcf - 0xd2 + ) + ) + ;; code offset: 0xb8 - 0x169 + (block $block + ;; code offset: 0xc2 - 0xc4 + (br_if $block + ;; code offset: 0xc1 - 0xc2 + (i32.eqz + ;; code offset: 0xbf - 0xc1 + (local.tee $10 + ;; code offset: 0xbc - 0xbf (i32.load - ;; code offset: 0xcd - 0xcf - (local.get $13) + ;; code offset: 0xba - 0xbc + (local.get $3) ) - ;; code offset: 0xd2 - 0xd4 - (local.get $4) ) ) - ;; code offset: 0xe4 - 0xe6 - (local.set $6 - ;; code offset: 0xe1 - 0xe4 + ) + ;; code offset: 0xcc - 0xce + (br_if $block + ;; code offset: 0xcb - 0xcc + (i32.eq + ;; code offset: 0xc6 - 0xc9 (i32.load - ;; code offset: 0xdf - 0xe1 - (local.tee $11 - ;; code offset: 0xdd - 0xdf - (call $memcpy - ;; code offset: 0xd7 - 0xd9 - (local.get $8) - ;; code offset: 0xd9 - 0xdb - (local.get $3) - ;; code offset: 0xdb - 0xdd - (local.get $12) - ) + ;; code offset: 0xc4 - 0xc6 + (local.get $13) + ) + ;; code offset: 0xc9 - 0xcb + (local.get $4) + ) + ) + ;; code offset: 0xdb - 0xdd + (local.set $6 + ;; code offset: 0xd8 - 0xdb + (i32.load + ;; code offset: 0xd6 - 0xd8 + (local.tee $11 + ;; code offset: 0xd4 - 0xd6 + (call $memcpy + ;; code offset: 0xce - 0xd0 + (local.get $8) + ;; code offset: 0xd0 - 0xd2 + (local.get $3) + ;; code offset: 0xd2 - 0xd4 + (local.get $12) ) ) ) - ;; code offset: 0xe8 - 0xea - (local.set $0 - ;; code offset: 0xe6 - 0xe8 - (i32.const 0) + ) + ;; code offset: 0xdf - 0xe1 + (local.set $0 + ;; code offset: 0xdd - 0xdf + (i32.const 0) + ) + ;; code offset: 0xe1 - 0x15c + (loop $label3 + ;; code offset: 0xe5 - 0xe7 + (local.set $16 + ;; code offset: 0xe3 - 0xe5 + (local.get $0) ) - ;; code offset: 0xea - 0x165 - (loop $label3 - ;; code offset: 0xee - 0xf0 - (local.set $16 - ;; code offset: 0xec - 0xee - (local.get $0) + ;; code offset: 0xec - 0x136 + (if + ;; code offset: 0xeb - 0xec + (i32.ge_s + ;; code offset: 0xe7 - 0xe9 + (local.get $6) + ;; code offset: 0xe9 - 0xeb + (i32.const 3) ) - ;; code offset: 0xf5 - 0x13f - (if - ;; code offset: 0xf4 - 0xf5 - (i32.ge_s - ;; code offset: 0xf0 - 0xf2 - (local.get $6) - ;; code offset: 0xf2 - 0xf4 - (i32.const 3) - ) - (then - ;; code offset: 0xfc - 0xfe - (local.set $1 - ;; code offset: 0xfb - 0xfc - (i32.sub - ;; code offset: 0xf7 - 0xf9 - (local.get $6) - ;; code offset: 0xf9 - 0xfb - (i32.const 1) - ) - ) - ;; code offset: 0x100 - 0x102 - (local.set $0 - ;; code offset: 0xfe - 0x100 + (then + ;; code offset: 0xf3 - 0xf5 + (local.set $1 + ;; code offset: 0xf2 - 0xf3 + (i32.sub + ;; code offset: 0xee - 0xf0 + (local.get $6) + ;; code offset: 0xf0 - 0xf2 (i32.const 1) ) - ;; code offset: 0x102 - 0x13e - (loop $label2 - ;; code offset: 0x111 - 0x113 - (local.set $15 - ;; code offset: 0x10e - 0x111 - (i32.load - ;; code offset: 0x10c - 0x10e - (local.tee $14 - ;; code offset: 0x10b - 0x10c - (i32.add - ;; code offset: 0x104 - 0x106 - (local.get $11) - ;; code offset: 0x10a - 0x10b - (i32.shl - ;; code offset: 0x106 - 0x108 - (local.get $0) - ;; code offset: 0x108 - 0x10a - (i32.const 2) - ) + ) + ;; code offset: 0xf7 - 0xf9 + (local.set $0 + ;; code offset: 0xf5 - 0xf7 + (i32.const 1) + ) + ;; code offset: 0xf9 - 0x135 + (loop $label2 + ;; code offset: 0x108 - 0x10a + (local.set $15 + ;; code offset: 0x105 - 0x108 + (i32.load + ;; code offset: 0x103 - 0x105 + (local.tee $14 + ;; code offset: 0x102 - 0x103 + (i32.add + ;; code offset: 0xfb - 0xfd + (local.get $11) + ;; code offset: 0x101 - 0x102 + (i32.shl + ;; code offset: 0xfd - 0xff + (local.get $0) + ;; code offset: 0xff - 0x101 + (i32.const 2) ) ) ) ) - ;; code offset: 0x122 - 0x125 - (i32.store - ;; code offset: 0x113 - 0x115 - (local.get $14) - ;; code offset: 0x11f - 0x122 - (i32.load - ;; code offset: 0x11d - 0x11f - (local.tee $7 - ;; code offset: 0x11c - 0x11d - (i32.add - ;; code offset: 0x115 - 0x117 - (local.get $11) - ;; code offset: 0x11b - 0x11c - (i32.shl - ;; code offset: 0x117 - 0x119 - (local.get $1) - ;; code offset: 0x119 - 0x11b - (i32.const 2) - ) + ) + ;; code offset: 0x119 - 0x11c + (i32.store + ;; code offset: 0x10a - 0x10c + (local.get $14) + ;; code offset: 0x116 - 0x119 + (i32.load + ;; code offset: 0x114 - 0x116 + (local.tee $7 + ;; code offset: 0x113 - 0x114 + (i32.add + ;; code offset: 0x10c - 0x10e + (local.get $11) + ;; code offset: 0x112 - 0x113 + (i32.shl + ;; code offset: 0x10e - 0x110 + (local.get $1) + ;; code offset: 0x110 - 0x112 + (i32.const 2) ) ) ) ) - ;; code offset: 0x129 - 0x12c - (i32.store - ;; code offset: 0x125 - 0x127 - (local.get $7) - ;; code offset: 0x127 - 0x129 - (local.get $15) - ) - ;; code offset: 0x13b - 0x13d - (br_if $label2 - ;; code offset: 0x13a - 0x13b - (i32.lt_s - ;; code offset: 0x131 - 0x133 - (local.tee $0 - ;; code offset: 0x130 - 0x131 - (i32.add - ;; code offset: 0x12c - 0x12e - (local.get $0) - ;; code offset: 0x12e - 0x130 - (i32.const 1) - ) + ) + ;; code offset: 0x120 - 0x123 + (i32.store + ;; code offset: 0x11c - 0x11e + (local.get $7) + ;; code offset: 0x11e - 0x120 + (local.get $15) + ) + ;; code offset: 0x132 - 0x134 + (br_if $label2 + ;; code offset: 0x131 - 0x132 + (i32.lt_s + ;; code offset: 0x128 - 0x12a + (local.tee $0 + ;; code offset: 0x127 - 0x128 + (i32.add + ;; code offset: 0x123 - 0x125 + (local.get $0) + ;; code offset: 0x125 - 0x127 + (i32.const 1) ) - ;; code offset: 0x138 - 0x13a - (local.tee $1 - ;; code offset: 0x137 - 0x138 - (i32.sub - ;; code offset: 0x133 - 0x135 - (local.get $1) - ;; code offset: 0x135 - 0x137 - (i32.const 1) - ) + ) + ;; code offset: 0x12f - 0x131 + (local.tee $1 + ;; code offset: 0x12e - 0x12f + (i32.sub + ;; code offset: 0x12a - 0x12c + (local.get $1) + ;; code offset: 0x12c - 0x12e + (i32.const 1) ) ) ) ) ) ) - ;; code offset: 0x14c - 0x14e - (local.set $1 - ;; code offset: 0x149 - 0x14c - (i32.load - ;; code offset: 0x147 - 0x149 - (local.tee $0 - ;; code offset: 0x146 - 0x147 - (i32.add - ;; code offset: 0x13f - 0x141 - (local.get $11) - ;; code offset: 0x145 - 0x146 - (i32.shl - ;; code offset: 0x141 - 0x143 - (local.get $6) - ;; code offset: 0x143 - 0x145 - (i32.const 2) - ) + ) + ;; code offset: 0x143 - 0x145 + (local.set $1 + ;; code offset: 0x140 - 0x143 + (i32.load + ;; code offset: 0x13e - 0x140 + (local.tee $0 + ;; code offset: 0x13d - 0x13e + (i32.add + ;; code offset: 0x136 - 0x138 + (local.get $11) + ;; code offset: 0x13c - 0x13d + (i32.shl + ;; code offset: 0x138 - 0x13a + (local.get $6) + ;; code offset: 0x13a - 0x13c + (i32.const 2) ) ) ) ) - ;; code offset: 0x152 - 0x155 - (i32.store + ) + ;; code offset: 0x149 - 0x14c + (i32.store + ;; code offset: 0x145 - 0x147 + (local.get $0) + ;; code offset: 0x147 - 0x149 + (local.get $6) + ) + ;; code offset: 0x151 - 0x153 + (local.set $0 + ;; code offset: 0x150 - 0x151 + (i32.add + ;; code offset: 0x14c - 0x14e + (local.get $16) ;; code offset: 0x14e - 0x150 - (local.get $0) - ;; code offset: 0x150 - 0x152 - (local.get $6) - ) - ;; code offset: 0x15a - 0x15c - (local.set $0 - ;; code offset: 0x159 - 0x15a - (i32.add - ;; code offset: 0x155 - 0x157 - (local.get $16) - ;; code offset: 0x157 - 0x159 - (i32.const 1) - ) + (i32.const 1) ) + ) + ;; code offset: 0x155 - 0x157 + (local.set $6 + ;; code offset: 0x153 - 0x155 + (local.get $1) + ) + ;; code offset: 0x159 - 0x15b + (br_if $label3 + ;; code offset: 0x157 - 0x159 + (local.get $1) + ) + ) + ;; code offset: 0x166 - 0x168 + (local.set $5 + ;; code offset: 0x165 - 0x166 + (select + ;; code offset: 0x15c - 0x15e + (local.get $5) ;; code offset: 0x15e - 0x160 - (local.set $6 - ;; code offset: 0x15c - 0x15e - (local.get $1) - ) - ;; code offset: 0x162 - 0x164 - (br_if $label3 + (local.get $0) + ;; code offset: 0x164 - 0x165 + (i32.gt_s ;; code offset: 0x160 - 0x162 - (local.get $1) - ) - ) - ;; code offset: 0x16f - 0x171 - (local.set $5 - ;; code offset: 0x16e - 0x16f - (select - ;; code offset: 0x165 - 0x167 (local.get $5) - ;; code offset: 0x167 - 0x169 - (local.get $0) - ;; code offset: 0x16d - 0x16e - (i32.gt_s - ;; code offset: 0x169 - 0x16b - (local.get $5) - ;; code offset: 0x16b - 0x16d - (local.get $16) - ) + ;; code offset: 0x162 - 0x164 + (local.get $16) ) ) ) - ;; code offset: 0x177 - 0x179 - (br_if $block2 - ;; code offset: 0x176 - 0x177 - (i32.ge_s - ;; code offset: 0x172 - 0x174 - (local.get $2) - ;; code offset: 0x174 - 0x176 - (local.get $4) - ) + ) + ;; code offset: 0x16e - 0x170 + (br_if $block1 + ;; code offset: 0x16d - 0x16e + (i32.ge_s + ;; code offset: 0x169 - 0x16b + (local.get $2) + ;; code offset: 0x16b - 0x16d + (local.get $4) ) - ;; code offset: 0x179 - 0x1f1 - (loop $label6 - ;; code offset: 0x17d - 0x17f - (local.set $1 - ;; code offset: 0x17b - 0x17d + ) + ;; code offset: 0x170 - 0x1e8 + (loop $label6 + ;; code offset: 0x174 - 0x176 + (local.set $1 + ;; code offset: 0x172 - 0x174 + (i32.const 0) + ) + ;; code offset: 0x17b - 0x1a7 + (if + ;; code offset: 0x17a - 0x17b + (i32.gt_s + ;; code offset: 0x176 - 0x178 + (local.get $2) + ;; code offset: 0x178 - 0x17a (i32.const 0) ) - ;; code offset: 0x184 - 0x1b0 - (if - ;; code offset: 0x183 - 0x184 - (i32.gt_s - ;; code offset: 0x17f - 0x181 - (local.get $2) - ;; code offset: 0x181 - 0x183 - (i32.const 0) - ) - (then - ;; code offset: 0x186 - 0x1ab - (loop $label4 - ;; code offset: 0x1a0 - 0x1a3 - (i32.store - ;; code offset: 0x18f - 0x190 + (then + ;; code offset: 0x17d - 0x1a2 + (loop $label4 + ;; code offset: 0x197 - 0x19a + (i32.store + ;; code offset: 0x186 - 0x187 + (i32.add + ;; code offset: 0x17f - 0x181 + (local.get $3) + ;; code offset: 0x185 - 0x186 + (i32.shl + ;; code offset: 0x181 - 0x183 + (local.get $1) + ;; code offset: 0x183 - 0x185 + (i32.const 2) + ) + ) + ;; code offset: 0x194 - 0x197 + (i32.load + ;; code offset: 0x193 - 0x194 (i32.add - ;; code offset: 0x188 - 0x18a + ;; code offset: 0x187 - 0x189 (local.get $3) - ;; code offset: 0x18e - 0x18f + ;; code offset: 0x192 - 0x193 (i32.shl - ;; code offset: 0x18a - 0x18c - (local.get $1) - ;; code offset: 0x18c - 0x18e - (i32.const 2) - ) - ) - ;; code offset: 0x19d - 0x1a0 - (i32.load - ;; code offset: 0x19c - 0x19d - (i32.add - ;; code offset: 0x190 - 0x192 - (local.get $3) - ;; code offset: 0x19b - 0x19c - (i32.shl - ;; code offset: 0x197 - 0x199 - (local.tee $1 - ;; code offset: 0x196 - 0x197 - (i32.add - ;; code offset: 0x192 - 0x194 - (local.get $1) - ;; code offset: 0x194 - 0x196 - (i32.const 1) - ) + ;; code offset: 0x18e - 0x190 + (local.tee $1 + ;; code offset: 0x18d - 0x18e + (i32.add + ;; code offset: 0x189 - 0x18b + (local.get $1) + ;; code offset: 0x18b - 0x18d + (i32.const 1) ) - ;; code offset: 0x199 - 0x19b - (i32.const 2) ) + ;; code offset: 0x190 - 0x192 + (i32.const 2) ) ) ) - ;; code offset: 0x1a8 - 0x1aa - (br_if $label4 - ;; code offset: 0x1a7 - 0x1a8 - (i32.ne - ;; code offset: 0x1a3 - 0x1a5 - (local.get $1) - ;; code offset: 0x1a5 - 0x1a7 - (local.get $2) - ) - ) ) - ;; code offset: 0x1ad - 0x1af - (local.set $1 - ;; code offset: 0x1ab - 0x1ad - (local.get $2) + ;; code offset: 0x19f - 0x1a1 + (br_if $label4 + ;; code offset: 0x19e - 0x19f + (i32.ne + ;; code offset: 0x19a - 0x19c + (local.get $1) + ;; code offset: 0x19c - 0x19e + (local.get $2) + ) ) ) + ;; code offset: 0x1a4 - 0x1a6 + (local.set $1 + ;; code offset: 0x1a2 - 0x1a4 + (local.get $2) + ) ) - ;; code offset: 0x1ba - 0x1bd - (i32.store - ;; code offset: 0x1b7 - 0x1b8 + ) + ;; code offset: 0x1b1 - 0x1b4 + (i32.store + ;; code offset: 0x1ae - 0x1af + (i32.add + ;; code offset: 0x1a7 - 0x1a9 + (local.get $3) + ;; code offset: 0x1ad - 0x1ae + (i32.shl + ;; code offset: 0x1a9 - 0x1ab + (local.get $1) + ;; code offset: 0x1ab - 0x1ad + (i32.const 2) + ) + ) + ;; code offset: 0x1af - 0x1b1 + (local.get $10) + ) + ;; code offset: 0x1c8 - 0x1cb + (i32.store + ;; code offset: 0x1bc - 0x1be + (local.tee $1 + ;; code offset: 0x1bb - 0x1bc (i32.add - ;; code offset: 0x1b0 - 0x1b2 - (local.get $3) - ;; code offset: 0x1b6 - 0x1b7 + ;; code offset: 0x1b4 - 0x1b6 + (local.get $9) + ;; code offset: 0x1ba - 0x1bb (i32.shl - ;; code offset: 0x1b2 - 0x1b4 - (local.get $1) - ;; code offset: 0x1b4 - 0x1b6 + ;; code offset: 0x1b6 - 0x1b8 + (local.get $2) + ;; code offset: 0x1b8 - 0x1ba (i32.const 2) ) ) - ;; code offset: 0x1b8 - 0x1ba - (local.get $10) ) - ;; code offset: 0x1d1 - 0x1d4 - (i32.store - ;; code offset: 0x1c5 - 0x1c7 + ;; code offset: 0x1c7 - 0x1c8 + (i32.sub + ;; code offset: 0x1c3 - 0x1c5 (local.tee $1 - ;; code offset: 0x1c4 - 0x1c5 - (i32.add - ;; code offset: 0x1bd - 0x1bf - (local.get $9) - ;; code offset: 0x1c3 - 0x1c4 - (i32.shl - ;; code offset: 0x1bf - 0x1c1 - (local.get $2) - ;; code offset: 0x1c1 - 0x1c3 - (i32.const 2) - ) - ) - ) - ;; code offset: 0x1d0 - 0x1d1 - (i32.sub - ;; code offset: 0x1cc - 0x1ce - (local.tee $1 - ;; code offset: 0x1c9 - 0x1cc - (i32.load - ;; code offset: 0x1c7 - 0x1c9 - (local.get $1) - ) + ;; code offset: 0x1c0 - 0x1c3 + (i32.load + ;; code offset: 0x1be - 0x1c0 + (local.get $1) ) - ;; code offset: 0x1ce - 0x1d0 - (i32.const 1) ) + ;; code offset: 0x1c5 - 0x1c7 + (i32.const 1) ) - ;; code offset: 0x1d9 - 0x1db - (br_if $label5 - ;; code offset: 0x1d8 - 0x1d9 - (i32.gt_s - ;; code offset: 0x1d4 - 0x1d6 - (local.get $1) - ;; code offset: 0x1d6 - 0x1d8 - (i32.const 1) - ) + ) + ;; code offset: 0x1d0 - 0x1d2 + (br_if $label5 + ;; code offset: 0x1cf - 0x1d0 + (i32.gt_s + ;; code offset: 0x1cb - 0x1cd + (local.get $1) + ;; code offset: 0x1cd - 0x1cf + (i32.const 1) ) - ;; code offset: 0x1e5 - 0x1e7 - (br_if $block2 - ;; code offset: 0x1e4 - 0x1e5 - (i32.eq - ;; code offset: 0x1e0 - 0x1e2 - (local.tee $2 - ;; code offset: 0x1df - 0x1e0 - (i32.add - ;; code offset: 0x1db - 0x1dd - (local.get $2) - ;; code offset: 0x1dd - 0x1df - (i32.const 1) - ) + ) + ;; code offset: 0x1dc - 0x1de + (br_if $block1 + ;; code offset: 0x1db - 0x1dc + (i32.eq + ;; code offset: 0x1d7 - 0x1d9 + (local.tee $2 + ;; code offset: 0x1d6 - 0x1d7 + (i32.add + ;; code offset: 0x1d2 - 0x1d4 + (local.get $2) + ;; code offset: 0x1d4 - 0x1d6 + (i32.const 1) ) - ;; code offset: 0x1e2 - 0x1e4 - (local.get $4) ) + ;; code offset: 0x1d9 - 0x1db + (local.get $4) ) - ;; code offset: 0x1ec - 0x1ee - (local.set $10 - ;; code offset: 0x1e9 - 0x1ec - (i32.load - ;; code offset: 0x1e7 - 0x1e9 - (local.get $3) - ) + ) + ;; code offset: 0x1e3 - 0x1e5 + (local.set $10 + ;; code offset: 0x1e0 - 0x1e3 + (i32.load + ;; code offset: 0x1de - 0x1e0 + (local.get $3) ) - ;; code offset: 0x1ee - 0x1f0 - (br $label6) ) - ;; code offset: 0x1f1 - 0x1f2 - (unreachable) + ;; code offset: 0x1e5 - 0x1e7 + (br $label6) ) - ;; code offset: 0x1f3 - 0x1f4 + ;; code offset: 0x1e8 - 0x1e9 (unreachable) ) + ;; code offset: 0x1ea - 0x1eb + (unreachable) ) - ;; code offset: 0x209 - 0x20c - (i32.store - ;; code offset: 0x201 - 0x202 - (i32.add - ;; code offset: 0x1f5 - 0x1f7 - (local.get $3) - ;; code offset: 0x200 - 0x201 - (i32.shl - ;; code offset: 0x1fc - 0x1fe - (local.tee $1 - ;; code offset: 0x1f9 - 0x1fc - (i32.load - ;; code offset: 0x1f7 - 0x1f9 - (local.get $0) - ) + ) + ;; code offset: 0x200 - 0x203 + (i32.store + ;; code offset: 0x1f8 - 0x1f9 + (i32.add + ;; code offset: 0x1ec - 0x1ee + (local.get $3) + ;; code offset: 0x1f7 - 0x1f8 + (i32.shl + ;; code offset: 0x1f3 - 0x1f5 + (local.tee $1 + ;; code offset: 0x1f0 - 0x1f3 + (i32.load + ;; code offset: 0x1ee - 0x1f0 + (local.get $0) ) - ;; code offset: 0x1fe - 0x200 - (i32.const 2) ) + ;; code offset: 0x1f5 - 0x1f7 + (i32.const 2) ) - ;; code offset: 0x207 - 0x209 - (local.tee $4 - ;; code offset: 0x206 - 0x207 - (i32.sub - ;; code offset: 0x202 - 0x204 - (local.get $2) - ;; code offset: 0x204 - 0x206 - (i32.const 1) - ) + ) + ;; code offset: 0x1fe - 0x200 + (local.tee $4 + ;; code offset: 0x1fd - 0x1fe + (i32.sub + ;; code offset: 0x1f9 - 0x1fb + (local.get $2) + ;; code offset: 0x1fb - 0x1fd + (i32.const 1) ) ) - ;; code offset: 0x218 - 0x21b - (i32.store - ;; code offset: 0x214 - 0x216 - (local.tee $13 - ;; code offset: 0x213 - 0x214 - (i32.add - ;; code offset: 0x20c - 0x20e - (local.get $3) - ;; code offset: 0x212 - 0x213 - (i32.shl - ;; code offset: 0x20e - 0x210 - (local.get $4) - ;; code offset: 0x210 - 0x212 - (i32.const 2) - ) + ) + ;; code offset: 0x20f - 0x212 + (i32.store + ;; code offset: 0x20b - 0x20d + (local.tee $13 + ;; code offset: 0x20a - 0x20b + (i32.add + ;; code offset: 0x203 - 0x205 + (local.get $3) + ;; code offset: 0x209 - 0x20a + (i32.shl + ;; code offset: 0x205 - 0x207 + (local.get $4) + ;; code offset: 0x207 - 0x209 + (i32.const 2) ) ) - ;; code offset: 0x216 - 0x218 - (local.get $1) ) + ;; code offset: 0x20d - 0x20f + (local.get $1) ) - ;; code offset: 0x21c - 0x370 + ;; code offset: 0x212 - 0x366 (loop $label11 - ;; code offset: 0x223 - 0x246 + ;; code offset: 0x219 - 0x23c (if - ;; code offset: 0x222 - 0x223 + ;; code offset: 0x218 - 0x219 (i32.ge_s - ;; code offset: 0x21e - 0x220 + ;; code offset: 0x214 - 0x216 (local.get $2) - ;; code offset: 0x220 - 0x222 + ;; code offset: 0x216 - 0x218 (i32.const 2) ) (then - ;; code offset: 0x225 - 0x245 + ;; code offset: 0x21b - 0x23b (loop $label7 - ;; code offset: 0x236 - 0x239 + ;; code offset: 0x22c - 0x22f (i32.store - ;; code offset: 0x233 - 0x234 + ;; code offset: 0x229 - 0x22a (i32.add - ;; code offset: 0x227 - 0x229 + ;; code offset: 0x21d - 0x21f (local.get $9) - ;; code offset: 0x232 - 0x233 + ;; code offset: 0x228 - 0x229 (i32.shl - ;; code offset: 0x22e - 0x230 + ;; code offset: 0x224 - 0x226 (local.tee $1 - ;; code offset: 0x22d - 0x22e + ;; code offset: 0x223 - 0x224 (i32.sub - ;; code offset: 0x229 - 0x22b + ;; code offset: 0x21f - 0x221 (local.get $2) - ;; code offset: 0x22b - 0x22d + ;; code offset: 0x221 - 0x223 (i32.const 1) ) ) - ;; code offset: 0x230 - 0x232 + ;; code offset: 0x226 - 0x228 (i32.const 2) ) ) - ;; code offset: 0x234 - 0x236 + ;; code offset: 0x22a - 0x22c (local.get $2) ) - ;; code offset: 0x242 - 0x244 + ;; code offset: 0x238 - 0x23a (br_if $label7 (block (result i32) (local.set $scratch_18 - ;; code offset: 0x23d - 0x23e + ;; code offset: 0x233 - 0x234 (i32.gt_s - ;; code offset: 0x239 - 0x23b + ;; code offset: 0x22f - 0x231 (local.get $2) - ;; code offset: 0x23b - 0x23d + ;; code offset: 0x231 - 0x233 (i32.const 2) ) ) - ;; code offset: 0x240 - 0x242 + ;; code offset: 0x236 - 0x238 (local.set $2 - ;; code offset: 0x23e - 0x240 + ;; code offset: 0x234 - 0x236 (local.get $1) ) (local.get $scratch_18) @@ -5451,154 +5424,154 @@ file_names[ 4]: ) ) ) - ;; code offset: 0x246 - 0x2ef - (block $block3 - ;; code offset: 0x250 - 0x252 - (br_if $block3 - ;; code offset: 0x24f - 0x250 + ;; code offset: 0x23c - 0x2e5 + (block $block2 + ;; code offset: 0x246 - 0x248 + (br_if $block2 + ;; code offset: 0x245 - 0x246 (i32.eqz - ;; code offset: 0x24d - 0x24f + ;; code offset: 0x243 - 0x245 (local.tee $6 - ;; code offset: 0x24a - 0x24d + ;; code offset: 0x240 - 0x243 (i32.load - ;; code offset: 0x248 - 0x24a + ;; code offset: 0x23e - 0x240 (local.get $3) ) ) ) ) - ;; code offset: 0x25a - 0x25c - (br_if $block3 - ;; code offset: 0x259 - 0x25a + ;; code offset: 0x250 - 0x252 + (br_if $block2 + ;; code offset: 0x24f - 0x250 (i32.eq - ;; code offset: 0x254 - 0x257 + ;; code offset: 0x24a - 0x24d (i32.load - ;; code offset: 0x252 - 0x254 + ;; code offset: 0x248 - 0x24a (local.get $13) ) - ;; code offset: 0x257 - 0x259 + ;; code offset: 0x24d - 0x24f (local.get $4) ) ) - ;; code offset: 0x261 - 0x263 + ;; code offset: 0x257 - 0x259 (local.set $7 - ;; code offset: 0x25e - 0x261 + ;; code offset: 0x254 - 0x257 (i32.load - ;; code offset: 0x25c - 0x25e + ;; code offset: 0x252 - 0x254 (local.get $8) ) ) - ;; code offset: 0x265 - 0x267 + ;; code offset: 0x25b - 0x25d (local.set $0 - ;; code offset: 0x263 - 0x265 + ;; code offset: 0x259 - 0x25b (i32.const 0) ) - ;; code offset: 0x267 - 0x2e2 + ;; code offset: 0x25d - 0x2d8 (loop $label9 - ;; code offset: 0x26b - 0x26d + ;; code offset: 0x261 - 0x263 (local.set $10 - ;; code offset: 0x269 - 0x26b + ;; code offset: 0x25f - 0x261 (local.get $0) ) - ;; code offset: 0x272 - 0x2bc + ;; code offset: 0x268 - 0x2b2 (if - ;; code offset: 0x271 - 0x272 + ;; code offset: 0x267 - 0x268 (i32.ge_s - ;; code offset: 0x26d - 0x26f + ;; code offset: 0x263 - 0x265 (local.get $7) - ;; code offset: 0x26f - 0x271 + ;; code offset: 0x265 - 0x267 (i32.const 3) ) (then - ;; code offset: 0x279 - 0x27b + ;; code offset: 0x26f - 0x271 (local.set $1 - ;; code offset: 0x278 - 0x279 + ;; code offset: 0x26e - 0x26f (i32.sub - ;; code offset: 0x274 - 0x276 + ;; code offset: 0x26a - 0x26c (local.get $7) - ;; code offset: 0x276 - 0x278 + ;; code offset: 0x26c - 0x26e (i32.const 1) ) ) - ;; code offset: 0x27d - 0x27f + ;; code offset: 0x273 - 0x275 (local.set $0 - ;; code offset: 0x27b - 0x27d + ;; code offset: 0x271 - 0x273 (i32.const 1) ) - ;; code offset: 0x27f - 0x2bb + ;; code offset: 0x275 - 0x2b1 (loop $label8 - ;; code offset: 0x28e - 0x290 + ;; code offset: 0x284 - 0x286 (local.set $14 - ;; code offset: 0x28b - 0x28e + ;; code offset: 0x281 - 0x284 (i32.load - ;; code offset: 0x289 - 0x28b + ;; code offset: 0x27f - 0x281 (local.tee $11 - ;; code offset: 0x288 - 0x289 + ;; code offset: 0x27e - 0x27f (i32.add - ;; code offset: 0x281 - 0x283 + ;; code offset: 0x277 - 0x279 (local.get $8) - ;; code offset: 0x287 - 0x288 + ;; code offset: 0x27d - 0x27e (i32.shl - ;; code offset: 0x283 - 0x285 + ;; code offset: 0x279 - 0x27b (local.get $0) - ;; code offset: 0x285 - 0x287 + ;; code offset: 0x27b - 0x27d (i32.const 2) ) ) ) ) ) - ;; code offset: 0x29f - 0x2a2 + ;; code offset: 0x295 - 0x298 (i32.store - ;; code offset: 0x290 - 0x292 + ;; code offset: 0x286 - 0x288 (local.get $11) - ;; code offset: 0x29c - 0x29f + ;; code offset: 0x292 - 0x295 (i32.load - ;; code offset: 0x29a - 0x29c + ;; code offset: 0x290 - 0x292 (local.tee $15 - ;; code offset: 0x299 - 0x29a + ;; code offset: 0x28f - 0x290 (i32.add - ;; code offset: 0x292 - 0x294 + ;; code offset: 0x288 - 0x28a (local.get $8) - ;; code offset: 0x298 - 0x299 + ;; code offset: 0x28e - 0x28f (i32.shl - ;; code offset: 0x294 - 0x296 + ;; code offset: 0x28a - 0x28c (local.get $1) - ;; code offset: 0x296 - 0x298 + ;; code offset: 0x28c - 0x28e (i32.const 2) ) ) ) ) ) - ;; code offset: 0x2a6 - 0x2a9 + ;; code offset: 0x29c - 0x29f (i32.store - ;; code offset: 0x2a2 - 0x2a4 + ;; code offset: 0x298 - 0x29a (local.get $15) - ;; code offset: 0x2a4 - 0x2a6 + ;; code offset: 0x29a - 0x29c (local.get $14) ) - ;; code offset: 0x2b8 - 0x2ba + ;; code offset: 0x2ae - 0x2b0 (br_if $label8 - ;; code offset: 0x2b7 - 0x2b8 + ;; code offset: 0x2ad - 0x2ae (i32.lt_s - ;; code offset: 0x2ae - 0x2b0 + ;; code offset: 0x2a4 - 0x2a6 (local.tee $0 - ;; code offset: 0x2ad - 0x2ae + ;; code offset: 0x2a3 - 0x2a4 (i32.add - ;; code offset: 0x2a9 - 0x2ab + ;; code offset: 0x29f - 0x2a1 (local.get $0) - ;; code offset: 0x2ab - 0x2ad + ;; code offset: 0x2a1 - 0x2a3 (i32.const 1) ) ) - ;; code offset: 0x2b5 - 0x2b7 + ;; code offset: 0x2ab - 0x2ad (local.tee $1 - ;; code offset: 0x2b4 - 0x2b5 + ;; code offset: 0x2aa - 0x2ab (i32.sub - ;; code offset: 0x2b0 - 0x2b2 + ;; code offset: 0x2a6 - 0x2a8 (local.get $1) - ;; code offset: 0x2b2 - 0x2b4 + ;; code offset: 0x2a8 - 0x2aa (i32.const 1) ) ) @@ -5607,267 +5580,267 @@ file_names[ 4]: ) ) ) - ;; code offset: 0x2c9 - 0x2cb + ;; code offset: 0x2bf - 0x2c1 (local.set $1 - ;; code offset: 0x2c6 - 0x2c9 + ;; code offset: 0x2bc - 0x2bf (i32.load - ;; code offset: 0x2c4 - 0x2c6 + ;; code offset: 0x2ba - 0x2bc (local.tee $0 - ;; code offset: 0x2c3 - 0x2c4 + ;; code offset: 0x2b9 - 0x2ba (i32.add - ;; code offset: 0x2bc - 0x2be + ;; code offset: 0x2b2 - 0x2b4 (local.get $8) - ;; code offset: 0x2c2 - 0x2c3 + ;; code offset: 0x2b8 - 0x2b9 (i32.shl - ;; code offset: 0x2be - 0x2c0 + ;; code offset: 0x2b4 - 0x2b6 (local.get $7) - ;; code offset: 0x2c0 - 0x2c2 + ;; code offset: 0x2b6 - 0x2b8 (i32.const 2) ) ) ) ) ) - ;; code offset: 0x2cf - 0x2d2 + ;; code offset: 0x2c5 - 0x2c8 (i32.store - ;; code offset: 0x2cb - 0x2cd + ;; code offset: 0x2c1 - 0x2c3 (local.get $0) - ;; code offset: 0x2cd - 0x2cf + ;; code offset: 0x2c3 - 0x2c5 (local.get $7) ) - ;; code offset: 0x2d7 - 0x2d9 + ;; code offset: 0x2cd - 0x2cf (local.set $0 - ;; code offset: 0x2d6 - 0x2d7 + ;; code offset: 0x2cc - 0x2cd (i32.add - ;; code offset: 0x2d2 - 0x2d4 + ;; code offset: 0x2c8 - 0x2ca (local.get $10) - ;; code offset: 0x2d4 - 0x2d6 + ;; code offset: 0x2ca - 0x2cc (i32.const 1) ) ) - ;; code offset: 0x2db - 0x2dd + ;; code offset: 0x2d1 - 0x2d3 (local.set $7 - ;; code offset: 0x2d9 - 0x2db + ;; code offset: 0x2cf - 0x2d1 (local.get $1) ) - ;; code offset: 0x2df - 0x2e1 + ;; code offset: 0x2d5 - 0x2d7 (br_if $label9 - ;; code offset: 0x2dd - 0x2df + ;; code offset: 0x2d3 - 0x2d5 (local.get $1) ) ) - ;; code offset: 0x2ec - 0x2ee + ;; code offset: 0x2e2 - 0x2e4 (local.set $5 - ;; code offset: 0x2eb - 0x2ec + ;; code offset: 0x2e1 - 0x2e2 (select - ;; code offset: 0x2e2 - 0x2e4 + ;; code offset: 0x2d8 - 0x2da (local.get $5) - ;; code offset: 0x2e4 - 0x2e6 + ;; code offset: 0x2da - 0x2dc (local.get $0) - ;; code offset: 0x2ea - 0x2eb + ;; code offset: 0x2e0 - 0x2e1 (i32.gt_s - ;; code offset: 0x2e6 - 0x2e8 + ;; code offset: 0x2dc - 0x2de (local.get $5) - ;; code offset: 0x2e8 - 0x2ea + ;; code offset: 0x2de - 0x2e0 (local.get $10) ) ) ) ) - ;; code offset: 0x2f4 - 0x2f6 - (br_if $block2 - ;; code offset: 0x2f3 - 0x2f4 + ;; code offset: 0x2ea - 0x2ec + (br_if $block1 + ;; code offset: 0x2e9 - 0x2ea (i32.ge_s - ;; code offset: 0x2ef - 0x2f1 + ;; code offset: 0x2e5 - 0x2e7 (local.get $2) - ;; code offset: 0x2f1 - 0x2f3 + ;; code offset: 0x2e7 - 0x2e9 (local.get $4) ) ) - ;; code offset: 0x2f6 - 0x36e + ;; code offset: 0x2ec - 0x364 (loop $label12 - ;; code offset: 0x2fa - 0x2fc + ;; code offset: 0x2f0 - 0x2f2 (local.set $1 - ;; code offset: 0x2f8 - 0x2fa + ;; code offset: 0x2ee - 0x2f0 (i32.const 0) ) - ;; code offset: 0x301 - 0x32d + ;; code offset: 0x2f7 - 0x323 (if - ;; code offset: 0x300 - 0x301 + ;; code offset: 0x2f6 - 0x2f7 (i32.gt_s - ;; code offset: 0x2fc - 0x2fe + ;; code offset: 0x2f2 - 0x2f4 (local.get $2) - ;; code offset: 0x2fe - 0x300 + ;; code offset: 0x2f4 - 0x2f6 (i32.const 0) ) (then - ;; code offset: 0x303 - 0x328 + ;; code offset: 0x2f9 - 0x31e (loop $label10 - ;; code offset: 0x31d - 0x320 + ;; code offset: 0x313 - 0x316 (i32.store - ;; code offset: 0x30c - 0x30d + ;; code offset: 0x302 - 0x303 (i32.add - ;; code offset: 0x305 - 0x307 + ;; code offset: 0x2fb - 0x2fd (local.get $3) - ;; code offset: 0x30b - 0x30c + ;; code offset: 0x301 - 0x302 (i32.shl - ;; code offset: 0x307 - 0x309 + ;; code offset: 0x2fd - 0x2ff (local.get $1) - ;; code offset: 0x309 - 0x30b + ;; code offset: 0x2ff - 0x301 (i32.const 2) ) ) - ;; code offset: 0x31a - 0x31d + ;; code offset: 0x310 - 0x313 (i32.load - ;; code offset: 0x319 - 0x31a + ;; code offset: 0x30f - 0x310 (i32.add - ;; code offset: 0x30d - 0x30f + ;; code offset: 0x303 - 0x305 (local.get $3) - ;; code offset: 0x318 - 0x319 + ;; code offset: 0x30e - 0x30f (i32.shl - ;; code offset: 0x314 - 0x316 + ;; code offset: 0x30a - 0x30c (local.tee $1 - ;; code offset: 0x313 - 0x314 + ;; code offset: 0x309 - 0x30a (i32.add - ;; code offset: 0x30f - 0x311 + ;; code offset: 0x305 - 0x307 (local.get $1) - ;; code offset: 0x311 - 0x313 + ;; code offset: 0x307 - 0x309 (i32.const 1) ) ) - ;; code offset: 0x316 - 0x318 + ;; code offset: 0x30c - 0x30e (i32.const 2) ) ) ) ) - ;; code offset: 0x325 - 0x327 + ;; code offset: 0x31b - 0x31d (br_if $label10 - ;; code offset: 0x324 - 0x325 + ;; code offset: 0x31a - 0x31b (i32.ne - ;; code offset: 0x320 - 0x322 + ;; code offset: 0x316 - 0x318 (local.get $1) - ;; code offset: 0x322 - 0x324 + ;; code offset: 0x318 - 0x31a (local.get $2) ) ) ) - ;; code offset: 0x32a - 0x32c + ;; code offset: 0x320 - 0x322 (local.set $1 - ;; code offset: 0x328 - 0x32a + ;; code offset: 0x31e - 0x320 (local.get $2) ) ) ) - ;; code offset: 0x337 - 0x33a + ;; code offset: 0x32d - 0x330 (i32.store - ;; code offset: 0x334 - 0x335 + ;; code offset: 0x32a - 0x32b (i32.add - ;; code offset: 0x32d - 0x32f + ;; code offset: 0x323 - 0x325 (local.get $3) - ;; code offset: 0x333 - 0x334 + ;; code offset: 0x329 - 0x32a (i32.shl - ;; code offset: 0x32f - 0x331 + ;; code offset: 0x325 - 0x327 (local.get $1) - ;; code offset: 0x331 - 0x333 + ;; code offset: 0x327 - 0x329 (i32.const 2) ) ) - ;; code offset: 0x335 - 0x337 + ;; code offset: 0x32b - 0x32d (local.get $6) ) - ;; code offset: 0x34e - 0x351 + ;; code offset: 0x344 - 0x347 (i32.store - ;; code offset: 0x342 - 0x344 + ;; code offset: 0x338 - 0x33a (local.tee $1 - ;; code offset: 0x341 - 0x342 + ;; code offset: 0x337 - 0x338 (i32.add - ;; code offset: 0x33a - 0x33c + ;; code offset: 0x330 - 0x332 (local.get $9) - ;; code offset: 0x340 - 0x341 + ;; code offset: 0x336 - 0x337 (i32.shl - ;; code offset: 0x33c - 0x33e + ;; code offset: 0x332 - 0x334 (local.get $2) - ;; code offset: 0x33e - 0x340 + ;; code offset: 0x334 - 0x336 (i32.const 2) ) ) ) - ;; code offset: 0x34d - 0x34e + ;; code offset: 0x343 - 0x344 (i32.sub - ;; code offset: 0x349 - 0x34b + ;; code offset: 0x33f - 0x341 (local.tee $1 - ;; code offset: 0x346 - 0x349 + ;; code offset: 0x33c - 0x33f (i32.load - ;; code offset: 0x344 - 0x346 + ;; code offset: 0x33a - 0x33c (local.get $1) ) ) - ;; code offset: 0x34b - 0x34d + ;; code offset: 0x341 - 0x343 (i32.const 1) ) ) - ;; code offset: 0x356 - 0x358 + ;; code offset: 0x34c - 0x34e (br_if $label11 - ;; code offset: 0x355 - 0x356 + ;; code offset: 0x34b - 0x34c (i32.gt_s - ;; code offset: 0x351 - 0x353 + ;; code offset: 0x347 - 0x349 (local.get $1) - ;; code offset: 0x353 - 0x355 + ;; code offset: 0x349 - 0x34b (i32.const 1) ) ) - ;; code offset: 0x362 - 0x364 - (br_if $block2 - ;; code offset: 0x361 - 0x362 + ;; code offset: 0x358 - 0x35a + (br_if $block1 + ;; code offset: 0x357 - 0x358 (i32.eq - ;; code offset: 0x35d - 0x35f + ;; code offset: 0x353 - 0x355 (local.tee $2 - ;; code offset: 0x35c - 0x35d + ;; code offset: 0x352 - 0x353 (i32.add - ;; code offset: 0x358 - 0x35a + ;; code offset: 0x34e - 0x350 (local.get $2) - ;; code offset: 0x35a - 0x35c + ;; code offset: 0x350 - 0x352 (i32.const 1) ) ) - ;; code offset: 0x35f - 0x361 + ;; code offset: 0x355 - 0x357 (local.get $4) ) ) - ;; code offset: 0x369 - 0x36b + ;; code offset: 0x35f - 0x361 (local.set $6 - ;; code offset: 0x366 - 0x369 + ;; code offset: 0x35c - 0x35f (i32.load - ;; code offset: 0x364 - 0x366 + ;; code offset: 0x35a - 0x35c (local.get $3) ) ) - ;; code offset: 0x36b - 0x36d + ;; code offset: 0x361 - 0x363 (br $label12) ) - ;; code offset: 0x36e - 0x36f + ;; code offset: 0x364 - 0x365 (unreachable) ) - ;; code offset: 0x370 - 0x371 + ;; code offset: 0x366 - 0x367 (unreachable) ) - ;; code offset: 0x374 - 0x376 + ;; code offset: 0x36a - 0x36c (call $free - ;; code offset: 0x372 - 0x374 + ;; code offset: 0x368 - 0x36a (local.get $3) ) - ;; code offset: 0x378 - 0x37a + ;; code offset: 0x36e - 0x370 (call $free - ;; code offset: 0x376 - 0x378 + ;; code offset: 0x36c - 0x36e (local.get $8) ) - ;; code offset: 0x37c - 0x37e + ;; code offset: 0x372 - 0x374 (call $free - ;; code offset: 0x37a - 0x37c + ;; code offset: 0x370 - 0x372 (local.get $9) ) - ;; code offset: 0x37e - 0x380 + ;; code offset: 0x374 - 0x376 (local.get $5) ) (func $main (param $0 i32) (param $1 i32) (result i32) @@ -5880,393 +5853,393 @@ file_names[ 4]: (local $8 i32) (local $scratch i32) (local $scratch_10 i32) - ;; code offset: 0x399 - 0x39b + ;; code offset: 0x38f - 0x391 (global.set $global$0 - ;; code offset: 0x397 - 0x399 + ;; code offset: 0x38d - 0x38f (local.tee $8 - ;; code offset: 0x396 - 0x397 + ;; code offset: 0x38c - 0x38d (i32.sub - ;; code offset: 0x392 - 0x394 + ;; code offset: 0x388 - 0x38a (global.get $global$0) - ;; code offset: 0x394 - 0x396 + ;; code offset: 0x38a - 0x38c (i32.const 32) ) ) ) - ;; code offset: 0x39b - 0x658 + ;; code offset: 0x391 - 0x64e (block $block1 - ;; code offset: 0x39d - 0x3c2 + ;; code offset: 0x393 - 0x3b8 (block $block - ;; code offset: 0x3a4 - 0x3b5 + ;; code offset: 0x39a - 0x3ab (if - ;; code offset: 0x3a3 - 0x3a4 + ;; code offset: 0x399 - 0x39a (i32.ge_s - ;; code offset: 0x39f - 0x3a1 + ;; code offset: 0x395 - 0x397 (local.get $0) - ;; code offset: 0x3a1 - 0x3a3 + ;; code offset: 0x397 - 0x399 (i32.const 2) ) (then - ;; code offset: 0x3b2 - 0x3b4 + ;; code offset: 0x3a8 - 0x3aa (br_if $block - ;; code offset: 0x3b1 - 0x3b2 + ;; code offset: 0x3a7 - 0x3a8 (i32.gt_s - ;; code offset: 0x3ad - 0x3af + ;; code offset: 0x3a3 - 0x3a5 (local.tee $3 - ;; code offset: 0x3ab - 0x3ad + ;; code offset: 0x3a1 - 0x3a3 (call $atoi - ;; code offset: 0x3a8 - 0x3ab + ;; code offset: 0x39e - 0x3a1 (i32.load offset=4 - ;; code offset: 0x3a6 - 0x3a8 + ;; code offset: 0x39c - 0x39e (local.get $1) ) ) ) - ;; code offset: 0x3af - 0x3b1 + ;; code offset: 0x3a5 - 0x3a7 (i32.const 0) ) ) ) ) - ;; code offset: 0x3ba - 0x3bb + ;; code offset: 0x3b0 - 0x3b1 (drop - ;; code offset: 0x3b8 - 0x3ba + ;; code offset: 0x3ae - 0x3b0 (call $puts - ;; code offset: 0x3b5 - 0x3b8 + ;; code offset: 0x3ab - 0x3ae (i32.const 1050) ) ) - ;; code offset: 0x3bd - 0x3bf + ;; code offset: 0x3b3 - 0x3b5 (local.set $5 - ;; code offset: 0x3bb - 0x3bd + ;; code offset: 0x3b1 - 0x3b3 (i32.const 1) ) - ;; code offset: 0x3bf - 0x3c1 + ;; code offset: 0x3b5 - 0x3b7 (br $block1) ) - ;; code offset: 0x3c7 - 0x405 + ;; code offset: 0x3bd - 0x3fb (if - ;; code offset: 0x3c6 - 0x3c7 + ;; code offset: 0x3bc - 0x3bd (i32.ne - ;; code offset: 0x3c2 - 0x3c4 + ;; code offset: 0x3b8 - 0x3ba (local.get $3) - ;; code offset: 0x3c4 - 0x3c6 + ;; code offset: 0x3ba - 0x3bc (i32.const 1) ) (then - ;; code offset: 0x3ce - 0x3d0 + ;; code offset: 0x3c4 - 0x3c6 (local.set $2 - ;; code offset: 0x3cd - 0x3ce + ;; code offset: 0x3c3 - 0x3c4 (i32.sub - ;; code offset: 0x3c9 - 0x3cb + ;; code offset: 0x3bf - 0x3c1 (local.get $3) - ;; code offset: 0x3cb - 0x3cd + ;; code offset: 0x3c1 - 0x3c3 (i32.const 1) ) ) - ;; code offset: 0x3d2 - 0x3d4 + ;; code offset: 0x3c8 - 0x3ca (local.set $1 - ;; code offset: 0x3d0 - 0x3d2 + ;; code offset: 0x3c6 - 0x3c8 (i32.const 0) ) - ;; code offset: 0x3d6 - 0x3d8 + ;; code offset: 0x3cc - 0x3ce (local.set $0 - ;; code offset: 0x3d4 - 0x3d6 + ;; code offset: 0x3ca - 0x3cc (i32.const 0) ) - ;; code offset: 0x3d8 - 0x404 + ;; code offset: 0x3ce - 0x3fa (loop $label - ;; code offset: 0x3e2 - 0x3e5 + ;; code offset: 0x3d8 - 0x3db (i32.store offset=8 - ;; code offset: 0x3de - 0x3e0 + ;; code offset: 0x3d4 - 0x3d6 (local.tee $4 - ;; code offset: 0x3dc - 0x3de + ;; code offset: 0x3d2 - 0x3d4 (call $malloc - ;; code offset: 0x3da - 0x3dc + ;; code offset: 0x3d0 - 0x3d2 (i32.const 12) ) ) - ;; code offset: 0x3e0 - 0x3e2 + ;; code offset: 0x3d6 - 0x3d8 (local.get $1) ) - ;; code offset: 0x3e9 - 0x3ec + ;; code offset: 0x3df - 0x3e2 (i32.store offset=4 - ;; code offset: 0x3e5 - 0x3e7 + ;; code offset: 0x3db - 0x3dd (local.get $4) - ;; code offset: 0x3e7 - 0x3e9 + ;; code offset: 0x3dd - 0x3df (local.get $3) ) - ;; code offset: 0x3f0 - 0x3f3 + ;; code offset: 0x3e6 - 0x3e9 (i32.store - ;; code offset: 0x3ec - 0x3ee + ;; code offset: 0x3e2 - 0x3e4 (local.get $4) - ;; code offset: 0x3ee - 0x3f0 + ;; code offset: 0x3e4 - 0x3e6 (local.get $0) ) - ;; code offset: 0x3f5 - 0x3f7 + ;; code offset: 0x3eb - 0x3ed (local.set $1 - ;; code offset: 0x3f3 - 0x3f5 + ;; code offset: 0x3e9 - 0x3eb (local.get $4) ) - ;; code offset: 0x401 - 0x403 + ;; code offset: 0x3f7 - 0x3f9 (br_if $label - ;; code offset: 0x400 - 0x401 + ;; code offset: 0x3f6 - 0x3f7 (i32.ne - ;; code offset: 0x3fc - 0x3fe + ;; code offset: 0x3f2 - 0x3f4 (local.tee $0 - ;; code offset: 0x3fb - 0x3fc + ;; code offset: 0x3f1 - 0x3f2 (i32.add - ;; code offset: 0x3f7 - 0x3f9 + ;; code offset: 0x3ed - 0x3ef (local.get $0) - ;; code offset: 0x3f9 - 0x3fb + ;; code offset: 0x3ef - 0x3f1 (i32.const 1) ) ) - ;; code offset: 0x3fe - 0x400 + ;; code offset: 0x3f4 - 0x3f6 (local.get $2) ) ) ) ) ) - ;; code offset: 0x407 - 0x409 + ;; code offset: 0x3fd - 0x3ff (local.set $0 - ;; code offset: 0x405 - 0x407 + ;; code offset: 0x3fb - 0x3fd (i32.const 0) ) - ;; code offset: 0x412 - 0x414 + ;; code offset: 0x408 - 0x40a (local.set $1 - ;; code offset: 0x410 - 0x412 + ;; code offset: 0x406 - 0x408 (call $malloc - ;; code offset: 0x40e - 0x410 + ;; code offset: 0x404 - 0x406 (local.tee $2 - ;; code offset: 0x40d - 0x40e + ;; code offset: 0x403 - 0x404 (i32.shl - ;; code offset: 0x409 - 0x40b + ;; code offset: 0x3ff - 0x401 (local.get $3) - ;; code offset: 0x40b - 0x40d + ;; code offset: 0x401 - 0x403 (i32.const 2) ) ) ) ) - ;; code offset: 0x418 - 0x41a + ;; code offset: 0x40e - 0x410 (local.set $5 - ;; code offset: 0x416 - 0x418 + ;; code offset: 0x40c - 0x40e (call $malloc - ;; code offset: 0x414 - 0x416 + ;; code offset: 0x40a - 0x40c (local.get $2) ) ) - ;; code offset: 0x41a - 0x604 + ;; code offset: 0x410 - 0x5fa (block $block4 - ;; code offset: 0x41c - 0x548 + ;; code offset: 0x412 - 0x53e (block $block3 - ;; code offset: 0x41e - 0x459 + ;; code offset: 0x414 - 0x44f (block $block2 - ;; code offset: 0x425 - 0x44e + ;; code offset: 0x41b - 0x444 (if - ;; code offset: 0x424 - 0x425 + ;; code offset: 0x41a - 0x41b (i32.gt_s - ;; code offset: 0x420 - 0x422 + ;; code offset: 0x416 - 0x418 (local.get $3) - ;; code offset: 0x422 - 0x424 + ;; code offset: 0x418 - 0x41a (i32.const 0) ) (then - ;; code offset: 0x427 - 0x443 + ;; code offset: 0x41d - 0x439 (loop $label1 - ;; code offset: 0x433 - 0x436 + ;; code offset: 0x429 - 0x42c (i32.store - ;; code offset: 0x430 - 0x431 + ;; code offset: 0x426 - 0x427 (i32.add - ;; code offset: 0x429 - 0x42b + ;; code offset: 0x41f - 0x421 (local.get $1) - ;; code offset: 0x42f - 0x430 + ;; code offset: 0x425 - 0x426 (i32.shl - ;; code offset: 0x42b - 0x42d + ;; code offset: 0x421 - 0x423 (local.get $0) - ;; code offset: 0x42d - 0x42f + ;; code offset: 0x423 - 0x425 (i32.const 2) ) ) - ;; code offset: 0x431 - 0x433 + ;; code offset: 0x427 - 0x429 (local.get $0) ) - ;; code offset: 0x440 - 0x442 + ;; code offset: 0x436 - 0x438 (br_if $label1 - ;; code offset: 0x43f - 0x440 + ;; code offset: 0x435 - 0x436 (i32.ne - ;; code offset: 0x43b - 0x43d + ;; code offset: 0x431 - 0x433 (local.tee $0 - ;; code offset: 0x43a - 0x43b + ;; code offset: 0x430 - 0x431 (i32.add - ;; code offset: 0x436 - 0x438 + ;; code offset: 0x42c - 0x42e (local.get $0) - ;; code offset: 0x438 - 0x43a + ;; code offset: 0x42e - 0x430 (i32.const 1) ) ) - ;; code offset: 0x43d - 0x43f + ;; code offset: 0x433 - 0x435 (local.get $3) ) ) ) - ;; code offset: 0x445 - 0x447 + ;; code offset: 0x43b - 0x43d (local.set $6 - ;; code offset: 0x443 - 0x445 + ;; code offset: 0x439 - 0x43b (i32.const 30) ) - ;; code offset: 0x449 - 0x44b + ;; code offset: 0x43f - 0x441 (local.set $2 - ;; code offset: 0x447 - 0x449 + ;; code offset: 0x43d - 0x43f (local.get $3) ) - ;; code offset: 0x44b - 0x44d + ;; code offset: 0x441 - 0x443 (br $block2) ) ) - ;; code offset: 0x450 - 0x452 + ;; code offset: 0x446 - 0x448 (local.set $6 - ;; code offset: 0x44e - 0x450 + ;; code offset: 0x444 - 0x446 (i32.const 30) ) - ;; code offset: 0x454 - 0x456 + ;; code offset: 0x44a - 0x44c (local.set $2 - ;; code offset: 0x452 - 0x454 + ;; code offset: 0x448 - 0x44a (local.get $3) ) - ;; code offset: 0x456 - 0x458 + ;; code offset: 0x44c - 0x44e (br $block3) ) - ;; code offset: 0x459 - 0x545 + ;; code offset: 0x44f - 0x53b (loop $label6 - ;; code offset: 0x45d - 0x45f + ;; code offset: 0x453 - 0x455 (local.set $0 - ;; code offset: 0x45b - 0x45d + ;; code offset: 0x451 - 0x453 (i32.const 0) ) - ;; code offset: 0x45f - 0x48c + ;; code offset: 0x455 - 0x482 (loop $label2 - ;; code offset: 0x471 - 0x474 + ;; code offset: 0x467 - 0x46a (i32.store offset=16 - ;; code offset: 0x461 - 0x463 + ;; code offset: 0x457 - 0x459 (local.get $8) - ;; code offset: 0x470 - 0x471 + ;; code offset: 0x466 - 0x467 (i32.add - ;; code offset: 0x46b - 0x46e + ;; code offset: 0x461 - 0x464 (i32.load - ;; code offset: 0x46a - 0x46b + ;; code offset: 0x460 - 0x461 (i32.add - ;; code offset: 0x463 - 0x465 + ;; code offset: 0x459 - 0x45b (local.get $1) - ;; code offset: 0x469 - 0x46a + ;; code offset: 0x45f - 0x460 (i32.shl - ;; code offset: 0x465 - 0x467 + ;; code offset: 0x45b - 0x45d (local.get $0) - ;; code offset: 0x467 - 0x469 + ;; code offset: 0x45d - 0x45f (i32.const 2) ) ) ) - ;; code offset: 0x46e - 0x470 + ;; code offset: 0x464 - 0x466 (i32.const 1) ) ) - ;; code offset: 0x47e - 0x47f + ;; code offset: 0x474 - 0x475 (drop - ;; code offset: 0x47c - 0x47e + ;; code offset: 0x472 - 0x474 (call $iprintf - ;; code offset: 0x474 - 0x477 + ;; code offset: 0x46a - 0x46d (i32.const 1047) - ;; code offset: 0x47b - 0x47c + ;; code offset: 0x471 - 0x472 (i32.add - ;; code offset: 0x477 - 0x479 + ;; code offset: 0x46d - 0x46f (local.get $8) - ;; code offset: 0x479 - 0x47b + ;; code offset: 0x46f - 0x471 (i32.const 16) ) ) ) - ;; code offset: 0x489 - 0x48b + ;; code offset: 0x47f - 0x481 (br_if $label2 - ;; code offset: 0x488 - 0x489 + ;; code offset: 0x47e - 0x47f (i32.ne - ;; code offset: 0x484 - 0x486 + ;; code offset: 0x47a - 0x47c (local.tee $0 - ;; code offset: 0x483 - 0x484 + ;; code offset: 0x479 - 0x47a (i32.add - ;; code offset: 0x47f - 0x481 + ;; code offset: 0x475 - 0x477 (local.get $0) - ;; code offset: 0x481 - 0x483 + ;; code offset: 0x477 - 0x479 (i32.const 1) ) ) - ;; code offset: 0x486 - 0x488 + ;; code offset: 0x47c - 0x47e (local.get $3) ) ) ) - ;; code offset: 0x490 - 0x491 + ;; code offset: 0x486 - 0x487 (drop - ;; code offset: 0x48e - 0x490 + ;; code offset: 0x484 - 0x486 (call $putchar - ;; code offset: 0x48c - 0x48e + ;; code offset: 0x482 - 0x484 (i32.const 10) ) ) - ;; code offset: 0x496 - 0x4b9 + ;; code offset: 0x48c - 0x4af (if - ;; code offset: 0x495 - 0x496 + ;; code offset: 0x48b - 0x48c (i32.gt_s - ;; code offset: 0x491 - 0x493 + ;; code offset: 0x487 - 0x489 (local.get $2) - ;; code offset: 0x493 - 0x495 + ;; code offset: 0x489 - 0x48b (i32.const 1) ) (then - ;; code offset: 0x498 - 0x4b8 + ;; code offset: 0x48e - 0x4ae (loop $label3 - ;; code offset: 0x4a9 - 0x4ac + ;; code offset: 0x49f - 0x4a2 (i32.store - ;; code offset: 0x4a6 - 0x4a7 + ;; code offset: 0x49c - 0x49d (i32.add - ;; code offset: 0x49a - 0x49c + ;; code offset: 0x490 - 0x492 (local.get $5) - ;; code offset: 0x4a5 - 0x4a6 + ;; code offset: 0x49b - 0x49c (i32.shl - ;; code offset: 0x4a1 - 0x4a3 + ;; code offset: 0x497 - 0x499 (local.tee $0 - ;; code offset: 0x4a0 - 0x4a1 + ;; code offset: 0x496 - 0x497 (i32.sub - ;; code offset: 0x49c - 0x49e + ;; code offset: 0x492 - 0x494 (local.get $2) - ;; code offset: 0x49e - 0x4a0 + ;; code offset: 0x494 - 0x496 (i32.const 1) ) ) - ;; code offset: 0x4a3 - 0x4a5 + ;; code offset: 0x499 - 0x49b (i32.const 2) ) ) - ;; code offset: 0x4a7 - 0x4a9 + ;; code offset: 0x49d - 0x49f (local.get $2) ) - ;; code offset: 0x4b5 - 0x4b7 + ;; code offset: 0x4ab - 0x4ad (br_if $label3 (block (result i32) (local.set $scratch - ;; code offset: 0x4b0 - 0x4b1 + ;; code offset: 0x4a6 - 0x4a7 (i32.gt_s - ;; code offset: 0x4ac - 0x4ae + ;; code offset: 0x4a2 - 0x4a4 (local.get $2) - ;; code offset: 0x4ae - 0x4b0 + ;; code offset: 0x4a4 - 0x4a6 (i32.const 2) ) ) - ;; code offset: 0x4b3 - 0x4b5 + ;; code offset: 0x4a9 - 0x4ab (local.set $2 - ;; code offset: 0x4b1 - 0x4b3 + ;; code offset: 0x4a7 - 0x4a9 (local.get $0) ) (local.get $scratch) @@ -6275,261 +6248,261 @@ file_names[ 4]: ) ) ) - ;; code offset: 0x4be - 0x4c0 + ;; code offset: 0x4b4 - 0x4b6 (br_if $block4 - ;; code offset: 0x4bd - 0x4be + ;; code offset: 0x4b3 - 0x4b4 (i32.eq - ;; code offset: 0x4b9 - 0x4bb + ;; code offset: 0x4af - 0x4b1 (local.get $2) - ;; code offset: 0x4bb - 0x4bd + ;; code offset: 0x4b1 - 0x4b3 (local.get $3) ) ) - ;; code offset: 0x4c5 - 0x4c7 + ;; code offset: 0x4bb - 0x4bd (local.set $6 - ;; code offset: 0x4c4 - 0x4c5 + ;; code offset: 0x4ba - 0x4bb (i32.sub - ;; code offset: 0x4c0 - 0x4c2 + ;; code offset: 0x4b6 - 0x4b8 (local.get $6) - ;; code offset: 0x4c2 - 0x4c4 + ;; code offset: 0x4b8 - 0x4ba (i32.const 1) ) ) - ;; code offset: 0x4c7 - 0x540 + ;; code offset: 0x4bd - 0x536 (loop $label5 - ;; code offset: 0x4cb - 0x4cd + ;; code offset: 0x4c1 - 0x4c3 (local.set $0 - ;; code offset: 0x4c9 - 0x4cb + ;; code offset: 0x4bf - 0x4c1 (i32.const 0) ) - ;; code offset: 0x4d2 - 0x4d4 + ;; code offset: 0x4c8 - 0x4ca (local.set $7 - ;; code offset: 0x4cf - 0x4d2 + ;; code offset: 0x4c5 - 0x4c8 (i32.load - ;; code offset: 0x4cd - 0x4cf + ;; code offset: 0x4c3 - 0x4c5 (local.get $1) ) ) - ;; code offset: 0x4d9 - 0x505 + ;; code offset: 0x4cf - 0x4fb (if - ;; code offset: 0x4d8 - 0x4d9 + ;; code offset: 0x4ce - 0x4cf (i32.gt_s - ;; code offset: 0x4d4 - 0x4d6 + ;; code offset: 0x4ca - 0x4cc (local.get $2) - ;; code offset: 0x4d6 - 0x4d8 + ;; code offset: 0x4cc - 0x4ce (i32.const 0) ) (then - ;; code offset: 0x4db - 0x500 + ;; code offset: 0x4d1 - 0x4f6 (loop $label4 - ;; code offset: 0x4f5 - 0x4f8 + ;; code offset: 0x4eb - 0x4ee (i32.store - ;; code offset: 0x4e4 - 0x4e5 + ;; code offset: 0x4da - 0x4db (i32.add - ;; code offset: 0x4dd - 0x4df + ;; code offset: 0x4d3 - 0x4d5 (local.get $1) - ;; code offset: 0x4e3 - 0x4e4 + ;; code offset: 0x4d9 - 0x4da (i32.shl - ;; code offset: 0x4df - 0x4e1 + ;; code offset: 0x4d5 - 0x4d7 (local.get $0) - ;; code offset: 0x4e1 - 0x4e3 + ;; code offset: 0x4d7 - 0x4d9 (i32.const 2) ) ) - ;; code offset: 0x4f2 - 0x4f5 + ;; code offset: 0x4e8 - 0x4eb (i32.load - ;; code offset: 0x4f1 - 0x4f2 + ;; code offset: 0x4e7 - 0x4e8 (i32.add - ;; code offset: 0x4e5 - 0x4e7 + ;; code offset: 0x4db - 0x4dd (local.get $1) - ;; code offset: 0x4f0 - 0x4f1 + ;; code offset: 0x4e6 - 0x4e7 (i32.shl - ;; code offset: 0x4ec - 0x4ee + ;; code offset: 0x4e2 - 0x4e4 (local.tee $0 - ;; code offset: 0x4eb - 0x4ec + ;; code offset: 0x4e1 - 0x4e2 (i32.add - ;; code offset: 0x4e7 - 0x4e9 + ;; code offset: 0x4dd - 0x4df (local.get $0) - ;; code offset: 0x4e9 - 0x4eb + ;; code offset: 0x4df - 0x4e1 (i32.const 1) ) ) - ;; code offset: 0x4ee - 0x4f0 + ;; code offset: 0x4e4 - 0x4e6 (i32.const 2) ) ) ) ) - ;; code offset: 0x4fd - 0x4ff + ;; code offset: 0x4f3 - 0x4f5 (br_if $label4 - ;; code offset: 0x4fc - 0x4fd + ;; code offset: 0x4f2 - 0x4f3 (i32.ne - ;; code offset: 0x4f8 - 0x4fa + ;; code offset: 0x4ee - 0x4f0 (local.get $0) - ;; code offset: 0x4fa - 0x4fc + ;; code offset: 0x4f0 - 0x4f2 (local.get $2) ) ) ) - ;; code offset: 0x502 - 0x504 + ;; code offset: 0x4f8 - 0x4fa (local.set $0 - ;; code offset: 0x500 - 0x502 + ;; code offset: 0x4f6 - 0x4f8 (local.get $2) ) ) ) - ;; code offset: 0x50f - 0x512 + ;; code offset: 0x505 - 0x508 (i32.store - ;; code offset: 0x50c - 0x50d + ;; code offset: 0x502 - 0x503 (i32.add - ;; code offset: 0x505 - 0x507 + ;; code offset: 0x4fb - 0x4fd (local.get $1) - ;; code offset: 0x50b - 0x50c + ;; code offset: 0x501 - 0x502 (i32.shl - ;; code offset: 0x507 - 0x509 + ;; code offset: 0x4fd - 0x4ff (local.get $0) - ;; code offset: 0x509 - 0x50b + ;; code offset: 0x4ff - 0x501 (i32.const 2) ) ) - ;; code offset: 0x50d - 0x50f + ;; code offset: 0x503 - 0x505 (local.get $7) ) - ;; code offset: 0x526 - 0x529 + ;; code offset: 0x51c - 0x51f (i32.store - ;; code offset: 0x51a - 0x51c + ;; code offset: 0x510 - 0x512 (local.tee $0 - ;; code offset: 0x519 - 0x51a + ;; code offset: 0x50f - 0x510 (i32.add - ;; code offset: 0x512 - 0x514 + ;; code offset: 0x508 - 0x50a (local.get $5) - ;; code offset: 0x518 - 0x519 + ;; code offset: 0x50e - 0x50f (i32.shl - ;; code offset: 0x514 - 0x516 + ;; code offset: 0x50a - 0x50c (local.get $2) - ;; code offset: 0x516 - 0x518 + ;; code offset: 0x50c - 0x50e (i32.const 2) ) ) ) - ;; code offset: 0x525 - 0x526 + ;; code offset: 0x51b - 0x51c (i32.sub - ;; code offset: 0x521 - 0x523 + ;; code offset: 0x517 - 0x519 (local.tee $0 - ;; code offset: 0x51e - 0x521 + ;; code offset: 0x514 - 0x517 (i32.load - ;; code offset: 0x51c - 0x51e + ;; code offset: 0x512 - 0x514 (local.get $0) ) ) - ;; code offset: 0x523 - 0x525 + ;; code offset: 0x519 - 0x51b (i32.const 1) ) ) - ;; code offset: 0x52e - 0x53f + ;; code offset: 0x524 - 0x535 (if - ;; code offset: 0x52d - 0x52e + ;; code offset: 0x523 - 0x524 (i32.le_s - ;; code offset: 0x529 - 0x52b + ;; code offset: 0x51f - 0x521 (local.get $0) - ;; code offset: 0x52b - 0x52d + ;; code offset: 0x521 - 0x523 (i32.const 1) ) (then - ;; code offset: 0x53a - 0x53c + ;; code offset: 0x530 - 0x532 (br_if $label5 - ;; code offset: 0x539 - 0x53a + ;; code offset: 0x52f - 0x530 (i32.ne - ;; code offset: 0x535 - 0x537 + ;; code offset: 0x52b - 0x52d (local.tee $2 - ;; code offset: 0x534 - 0x535 + ;; code offset: 0x52a - 0x52b (i32.add - ;; code offset: 0x530 - 0x532 + ;; code offset: 0x526 - 0x528 (local.get $2) - ;; code offset: 0x532 - 0x534 + ;; code offset: 0x528 - 0x52a (i32.const 1) ) ) - ;; code offset: 0x537 - 0x539 + ;; code offset: 0x52d - 0x52f (local.get $3) ) ) - ;; code offset: 0x53c - 0x53e + ;; code offset: 0x532 - 0x534 (br $block4) ) ) ) - ;; code offset: 0x542 - 0x544 + ;; code offset: 0x538 - 0x53a (br_if $label6 - ;; code offset: 0x540 - 0x542 + ;; code offset: 0x536 - 0x538 (local.get $6) ) ) - ;; code offset: 0x545 - 0x547 + ;; code offset: 0x53b - 0x53d (br $block4) ) - ;; code offset: 0x548 - 0x603 + ;; code offset: 0x53e - 0x5f9 (loop $label10 - ;; code offset: 0x54e - 0x54f + ;; code offset: 0x544 - 0x545 (drop - ;; code offset: 0x54c - 0x54e + ;; code offset: 0x542 - 0x544 (call $putchar - ;; code offset: 0x54a - 0x54c + ;; code offset: 0x540 - 0x542 (i32.const 10) ) ) - ;; code offset: 0x554 - 0x577 + ;; code offset: 0x54a - 0x56d (if - ;; code offset: 0x553 - 0x554 + ;; code offset: 0x549 - 0x54a (i32.gt_s - ;; code offset: 0x54f - 0x551 + ;; code offset: 0x545 - 0x547 (local.get $2) - ;; code offset: 0x551 - 0x553 + ;; code offset: 0x547 - 0x549 (i32.const 1) ) (then - ;; code offset: 0x556 - 0x576 + ;; code offset: 0x54c - 0x56c (loop $label7 - ;; code offset: 0x567 - 0x56a + ;; code offset: 0x55d - 0x560 (i32.store - ;; code offset: 0x564 - 0x565 + ;; code offset: 0x55a - 0x55b (i32.add - ;; code offset: 0x558 - 0x55a + ;; code offset: 0x54e - 0x550 (local.get $5) - ;; code offset: 0x563 - 0x564 + ;; code offset: 0x559 - 0x55a (i32.shl - ;; code offset: 0x55f - 0x561 + ;; code offset: 0x555 - 0x557 (local.tee $0 - ;; code offset: 0x55e - 0x55f + ;; code offset: 0x554 - 0x555 (i32.sub - ;; code offset: 0x55a - 0x55c + ;; code offset: 0x550 - 0x552 (local.get $2) - ;; code offset: 0x55c - 0x55e + ;; code offset: 0x552 - 0x554 (i32.const 1) ) ) - ;; code offset: 0x561 - 0x563 + ;; code offset: 0x557 - 0x559 (i32.const 2) ) ) - ;; code offset: 0x565 - 0x567 + ;; code offset: 0x55b - 0x55d (local.get $2) ) - ;; code offset: 0x573 - 0x575 + ;; code offset: 0x569 - 0x56b (br_if $label7 (block (result i32) (local.set $scratch_10 - ;; code offset: 0x56e - 0x56f + ;; code offset: 0x564 - 0x565 (i32.gt_s - ;; code offset: 0x56a - 0x56c + ;; code offset: 0x560 - 0x562 (local.get $2) - ;; code offset: 0x56c - 0x56e + ;; code offset: 0x562 - 0x564 (i32.const 2) ) ) - ;; code offset: 0x571 - 0x573 + ;; code offset: 0x567 - 0x569 (local.set $2 - ;; code offset: 0x56f - 0x571 + ;; code offset: 0x565 - 0x567 (local.get $0) ) (local.get $scratch_10) @@ -6538,318 +6511,318 @@ file_names[ 4]: ) ) ) - ;; code offset: 0x57c - 0x57e + ;; code offset: 0x572 - 0x574 (br_if $block4 - ;; code offset: 0x57b - 0x57c + ;; code offset: 0x571 - 0x572 (i32.eq - ;; code offset: 0x577 - 0x579 + ;; code offset: 0x56d - 0x56f (local.get $2) - ;; code offset: 0x579 - 0x57b + ;; code offset: 0x56f - 0x571 (local.get $3) ) ) - ;; code offset: 0x583 - 0x585 + ;; code offset: 0x579 - 0x57b (local.set $6 - ;; code offset: 0x582 - 0x583 + ;; code offset: 0x578 - 0x579 (i32.sub - ;; code offset: 0x57e - 0x580 + ;; code offset: 0x574 - 0x576 (local.get $6) - ;; code offset: 0x580 - 0x582 + ;; code offset: 0x576 - 0x578 (i32.const 1) ) ) - ;; code offset: 0x585 - 0x5fe + ;; code offset: 0x57b - 0x5f4 (loop $label9 - ;; code offset: 0x58c - 0x58e + ;; code offset: 0x582 - 0x584 (local.set $7 - ;; code offset: 0x589 - 0x58c + ;; code offset: 0x57f - 0x582 (i32.load - ;; code offset: 0x587 - 0x589 + ;; code offset: 0x57d - 0x57f (local.get $1) ) ) - ;; code offset: 0x590 - 0x592 + ;; code offset: 0x586 - 0x588 (local.set $0 - ;; code offset: 0x58e - 0x590 + ;; code offset: 0x584 - 0x586 (i32.const 0) ) - ;; code offset: 0x597 - 0x5c3 + ;; code offset: 0x58d - 0x5b9 (if - ;; code offset: 0x596 - 0x597 + ;; code offset: 0x58c - 0x58d (i32.gt_s - ;; code offset: 0x592 - 0x594 + ;; code offset: 0x588 - 0x58a (local.get $2) - ;; code offset: 0x594 - 0x596 + ;; code offset: 0x58a - 0x58c (i32.const 0) ) (then - ;; code offset: 0x599 - 0x5be + ;; code offset: 0x58f - 0x5b4 (loop $label8 - ;; code offset: 0x5b3 - 0x5b6 + ;; code offset: 0x5a9 - 0x5ac (i32.store - ;; code offset: 0x5a2 - 0x5a3 + ;; code offset: 0x598 - 0x599 (i32.add - ;; code offset: 0x59b - 0x59d + ;; code offset: 0x591 - 0x593 (local.get $1) - ;; code offset: 0x5a1 - 0x5a2 + ;; code offset: 0x597 - 0x598 (i32.shl - ;; code offset: 0x59d - 0x59f + ;; code offset: 0x593 - 0x595 (local.get $0) - ;; code offset: 0x59f - 0x5a1 + ;; code offset: 0x595 - 0x597 (i32.const 2) ) ) - ;; code offset: 0x5b0 - 0x5b3 + ;; code offset: 0x5a6 - 0x5a9 (i32.load - ;; code offset: 0x5af - 0x5b0 + ;; code offset: 0x5a5 - 0x5a6 (i32.add - ;; code offset: 0x5a3 - 0x5a5 + ;; code offset: 0x599 - 0x59b (local.get $1) - ;; code offset: 0x5ae - 0x5af + ;; code offset: 0x5a4 - 0x5a5 (i32.shl - ;; code offset: 0x5aa - 0x5ac + ;; code offset: 0x5a0 - 0x5a2 (local.tee $0 - ;; code offset: 0x5a9 - 0x5aa + ;; code offset: 0x59f - 0x5a0 (i32.add - ;; code offset: 0x5a5 - 0x5a7 + ;; code offset: 0x59b - 0x59d (local.get $0) - ;; code offset: 0x5a7 - 0x5a9 + ;; code offset: 0x59d - 0x59f (i32.const 1) ) ) - ;; code offset: 0x5ac - 0x5ae + ;; code offset: 0x5a2 - 0x5a4 (i32.const 2) ) ) ) ) - ;; code offset: 0x5bb - 0x5bd + ;; code offset: 0x5b1 - 0x5b3 (br_if $label8 - ;; code offset: 0x5ba - 0x5bb + ;; code offset: 0x5b0 - 0x5b1 (i32.ne - ;; code offset: 0x5b6 - 0x5b8 + ;; code offset: 0x5ac - 0x5ae (local.get $0) - ;; code offset: 0x5b8 - 0x5ba + ;; code offset: 0x5ae - 0x5b0 (local.get $2) ) ) ) - ;; code offset: 0x5c0 - 0x5c2 + ;; code offset: 0x5b6 - 0x5b8 (local.set $0 - ;; code offset: 0x5be - 0x5c0 + ;; code offset: 0x5b4 - 0x5b6 (local.get $2) ) ) ) - ;; code offset: 0x5cd - 0x5d0 + ;; code offset: 0x5c3 - 0x5c6 (i32.store - ;; code offset: 0x5ca - 0x5cb + ;; code offset: 0x5c0 - 0x5c1 (i32.add - ;; code offset: 0x5c3 - 0x5c5 + ;; code offset: 0x5b9 - 0x5bb (local.get $1) - ;; code offset: 0x5c9 - 0x5ca + ;; code offset: 0x5bf - 0x5c0 (i32.shl - ;; code offset: 0x5c5 - 0x5c7 + ;; code offset: 0x5bb - 0x5bd (local.get $0) - ;; code offset: 0x5c7 - 0x5c9 + ;; code offset: 0x5bd - 0x5bf (i32.const 2) ) ) - ;; code offset: 0x5cb - 0x5cd + ;; code offset: 0x5c1 - 0x5c3 (local.get $7) ) - ;; code offset: 0x5e4 - 0x5e7 + ;; code offset: 0x5da - 0x5dd (i32.store - ;; code offset: 0x5d8 - 0x5da + ;; code offset: 0x5ce - 0x5d0 (local.tee $0 - ;; code offset: 0x5d7 - 0x5d8 + ;; code offset: 0x5cd - 0x5ce (i32.add - ;; code offset: 0x5d0 - 0x5d2 + ;; code offset: 0x5c6 - 0x5c8 (local.get $5) - ;; code offset: 0x5d6 - 0x5d7 + ;; code offset: 0x5cc - 0x5cd (i32.shl - ;; code offset: 0x5d2 - 0x5d4 + ;; code offset: 0x5c8 - 0x5ca (local.get $2) - ;; code offset: 0x5d4 - 0x5d6 + ;; code offset: 0x5ca - 0x5cc (i32.const 2) ) ) ) - ;; code offset: 0x5e3 - 0x5e4 + ;; code offset: 0x5d9 - 0x5da (i32.sub - ;; code offset: 0x5df - 0x5e1 + ;; code offset: 0x5d5 - 0x5d7 (local.tee $0 - ;; code offset: 0x5dc - 0x5df + ;; code offset: 0x5d2 - 0x5d5 (i32.load - ;; code offset: 0x5da - 0x5dc + ;; code offset: 0x5d0 - 0x5d2 (local.get $0) ) ) - ;; code offset: 0x5e1 - 0x5e3 + ;; code offset: 0x5d7 - 0x5d9 (i32.const 1) ) ) - ;; code offset: 0x5ec - 0x5fd + ;; code offset: 0x5e2 - 0x5f3 (if - ;; code offset: 0x5eb - 0x5ec + ;; code offset: 0x5e1 - 0x5e2 (i32.le_s - ;; code offset: 0x5e7 - 0x5e9 + ;; code offset: 0x5dd - 0x5df (local.get $0) - ;; code offset: 0x5e9 - 0x5eb + ;; code offset: 0x5df - 0x5e1 (i32.const 1) ) (then - ;; code offset: 0x5f8 - 0x5fa + ;; code offset: 0x5ee - 0x5f0 (br_if $label9 - ;; code offset: 0x5f7 - 0x5f8 + ;; code offset: 0x5ed - 0x5ee (i32.ne - ;; code offset: 0x5f3 - 0x5f5 + ;; code offset: 0x5e9 - 0x5eb (local.tee $2 - ;; code offset: 0x5f2 - 0x5f3 + ;; code offset: 0x5e8 - 0x5e9 (i32.add - ;; code offset: 0x5ee - 0x5f0 + ;; code offset: 0x5e4 - 0x5e6 (local.get $2) - ;; code offset: 0x5f0 - 0x5f2 + ;; code offset: 0x5e6 - 0x5e8 (i32.const 1) ) ) - ;; code offset: 0x5f5 - 0x5f7 + ;; code offset: 0x5eb - 0x5ed (local.get $3) ) ) - ;; code offset: 0x5fa - 0x5fc + ;; code offset: 0x5f0 - 0x5f2 (br $block4) ) ) ) - ;; code offset: 0x600 - 0x602 + ;; code offset: 0x5f6 - 0x5f8 (br_if $label10 - ;; code offset: 0x5fe - 0x600 + ;; code offset: 0x5f4 - 0x5f6 (local.get $6) ) ) ) - ;; code offset: 0x606 - 0x608 + ;; code offset: 0x5fc - 0x5fe (call $free - ;; code offset: 0x604 - 0x606 + ;; code offset: 0x5fa - 0x5fc (local.get $1) ) - ;; code offset: 0x60a - 0x60c + ;; code offset: 0x600 - 0x602 (call $free - ;; code offset: 0x608 - 0x60a + ;; code offset: 0x5fe - 0x600 (local.get $5) ) - ;; code offset: 0x60e - 0x610 + ;; code offset: 0x604 - 0x606 (local.set $5 - ;; code offset: 0x60c - 0x60e + ;; code offset: 0x602 - 0x604 (i32.const 0) ) - ;; code offset: 0x612 - 0x614 + ;; code offset: 0x608 - 0x60a (local.set $0 - ;; code offset: 0x610 - 0x612 + ;; code offset: 0x606 - 0x608 (i32.const 0) ) - ;; code offset: 0x616 - 0x641 + ;; code offset: 0x60c - 0x637 (if - ;; code offset: 0x614 - 0x616 + ;; code offset: 0x60a - 0x60c (local.get $4) (then - ;; code offset: 0x618 - 0x640 + ;; code offset: 0x60e - 0x636 (loop $label11 - ;; code offset: 0x61e - 0x620 + ;; code offset: 0x614 - 0x616 (local.set $1 - ;; code offset: 0x61c - 0x61e + ;; code offset: 0x612 - 0x614 (call $"fannkuch_worker(void*)" - ;; code offset: 0x61a - 0x61c + ;; code offset: 0x610 - 0x612 (local.get $4) ) ) - ;; code offset: 0x625 - 0x627 + ;; code offset: 0x61b - 0x61d (local.set $2 - ;; code offset: 0x622 - 0x625 + ;; code offset: 0x618 - 0x61b (i32.load offset=8 - ;; code offset: 0x620 - 0x622 + ;; code offset: 0x616 - 0x618 (local.get $4) ) ) - ;; code offset: 0x629 - 0x62b + ;; code offset: 0x61f - 0x621 (call $free - ;; code offset: 0x627 - 0x629 + ;; code offset: 0x61d - 0x61f (local.get $4) ) - ;; code offset: 0x635 - 0x637 + ;; code offset: 0x62b - 0x62d (local.set $0 - ;; code offset: 0x634 - 0x635 + ;; code offset: 0x62a - 0x62b (select - ;; code offset: 0x62b - 0x62d + ;; code offset: 0x621 - 0x623 (local.get $1) - ;; code offset: 0x62d - 0x62f + ;; code offset: 0x623 - 0x625 (local.get $0) - ;; code offset: 0x633 - 0x634 + ;; code offset: 0x629 - 0x62a (i32.lt_s - ;; code offset: 0x62f - 0x631 + ;; code offset: 0x625 - 0x627 (local.get $0) - ;; code offset: 0x631 - 0x633 + ;; code offset: 0x627 - 0x629 (local.get $1) ) ) ) - ;; code offset: 0x639 - 0x63b + ;; code offset: 0x62f - 0x631 (local.set $4 - ;; code offset: 0x637 - 0x639 + ;; code offset: 0x62d - 0x62f (local.get $2) ) - ;; code offset: 0x63d - 0x63f + ;; code offset: 0x633 - 0x635 (br_if $label11 - ;; code offset: 0x63b - 0x63d + ;; code offset: 0x631 - 0x633 (local.get $2) ) ) ) ) - ;; code offset: 0x645 - 0x648 + ;; code offset: 0x63b - 0x63e (i32.store offset=4 - ;; code offset: 0x641 - 0x643 + ;; code offset: 0x637 - 0x639 (local.get $8) - ;; code offset: 0x643 - 0x645 + ;; code offset: 0x639 - 0x63b (local.get $0) ) - ;; code offset: 0x64c - 0x64f + ;; code offset: 0x642 - 0x645 (i32.store - ;; code offset: 0x648 - 0x64a + ;; code offset: 0x63e - 0x640 (local.get $8) - ;; code offset: 0x64a - 0x64c + ;; code offset: 0x640 - 0x642 (local.get $3) ) - ;; code offset: 0x656 - 0x657 + ;; code offset: 0x64c - 0x64d (drop - ;; code offset: 0x654 - 0x656 + ;; code offset: 0x64a - 0x64c (call $iprintf - ;; code offset: 0x64f - 0x652 + ;; code offset: 0x645 - 0x648 (i32.const 1024) - ;; code offset: 0x652 - 0x654 + ;; code offset: 0x648 - 0x64a (local.get $8) ) ) ) - ;; code offset: 0x65d - 0x65f + ;; code offset: 0x653 - 0x655 (global.set $global$0 - ;; code offset: 0x65c - 0x65d + ;; code offset: 0x652 - 0x653 (i32.add - ;; code offset: 0x658 - 0x65a + ;; code offset: 0x64e - 0x650 (local.get $8) - ;; code offset: 0x65a - 0x65c + ;; code offset: 0x650 - 0x652 (i32.const 32) ) ) - ;; code offset: 0x65f - 0x661 + ;; code offset: 0x655 - 0x657 (local.get $5) ) ;; custom section ".debug_info", size 851 ;; custom section ".debug_loc", size 1073 ;; custom section ".debug_ranges", size 88 ;; custom section ".debug_abbrev", size 333 - ;; custom section ".debug_line", size 2642 + ;; custom section ".debug_line", size 2618 ;; custom section ".debug_str", size 434 ;; custom section "producers", size 135 ) From 1af77dabb5029757965680e0622c77149e6cfe18 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 17 Aug 2026 14:12:57 -0700 Subject: [PATCH 14/93] PR number --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b73da6c5af3..0901c975ec2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ Current Trunk ------------- - Add a new `--constraint-analysis` pass which propagates logical facts along - branches. + branches. (#9010) v132 ---- From abd5148f1bdb7686d46fa0f68d81122a5971b775 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 17 Aug 2026 16:02:09 -0700 Subject: [PATCH 15/93] issue --- src/ir/constraint.cpp | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index a1516280deb..61bd1f738d5 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -535,35 +535,37 @@ void BasicBlockConstraintMap::set(Index index, Expression* value) { // Apply a constraint to a value, x = C. if (Properties::isSingleConstantExpression(value)) { auto c = Properties::getLiteral(value); - set(index, Constraint{Abstract::Eq, {c}}); + set(index, Constraint{Eq, {c}}); return; } // Apply a constraint to a local, x = y. if (auto* get = value->dynCast()) { - set(index, Constraint{Abstract::Eq, {get->index}}); + set(index, Constraint{Eq, {get->index}}); return; } if (auto* tee = value->dynCast()) { - set(index, Constraint{Abstract::Eq, {tee->index}}); + set(index, Constraint{Eq, {tee->index}}); return; } // Apply an increment of a local, x = y + 1. Index y; - if (matches(value, binary(Abstract::Add, local(&y), ival(1)))) { - // The local y must have old constraints that we know how to increment. - auto old = get(y); + if (matches(value, binary(Add, local(&y), ival(1)))) { + // The local y must have old constraints that we know how to increment and + // transform into new ones. + const auto old = get(y); + auto new_ = old; // Iterate over the old constraints and increment each one. - for (auto iter = old.begin(); iter != old.end();) { + for (auto iter = new_.begin(); iter != new_.end();) { auto& c = *iter; auto* N = std::get_if(&c.term); if (!N) { // A non-constant term, which we don't know how to increment. Simply // remove it: we are losing proving power here, but doing so is never // invalid. - iter = old.erase(iter); + iter = new_.erase(iter); continue; } @@ -572,11 +574,19 @@ void BasicBlockConstraintMap::set(Index index, Expression* value) { case Eq: *N = N->add(Literal::makeFromInt32(1, N->type)); break; - // x >= N, x++ => x > N + // x >= N, x++ => x > N if no overflow case GeS: + if (old.proves({LtS, Literal::makeSignedMax(N->type)}) != True) { + iter = new_.erase(iter); + continue; + } c.op = GtS; break; case GeU: + if (old.proves({LtU, Literal::makeUnsignedMax(N->type)}) != True) { + iter = new_.erase(iter); + continue; + } c.op = GtU; break; // x < N, x++ => x <= N @@ -589,28 +599,28 @@ void BasicBlockConstraintMap::set(Index index, Expression* value) { // x <= N, x++ => x <= N+1 if no overflow case LeS: if (N->isSignedMax()) { - iter = old.erase(iter); + iter = new_.erase(iter); continue; } *N = N->add(Literal::makeFromInt32(1, N->type)); break; case LeU: if (N->isUnsignedMax()) { - iter = old.erase(iter); + iter = new_.erase(iter); continue; } *N = N->add(Literal::makeFromInt32(1, N->type)); break; default: // Something we don't recognize. - iter = old.erase(iter); + iter = new_.erase(iter); continue; } ++iter; } - set(index, old); + set(index, new_); return; } From 8b1e33f456b2fc5298576b802f8c7a64ecd0fa9b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 17 Aug 2026 16:03:55 -0700 Subject: [PATCH 16/93] test --- test/lit/passes/constraint-analysis-loops.wast | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/lit/passes/constraint-analysis-loops.wast b/test/lit/passes/constraint-analysis-loops.wast index 9e503b01e95..91ad2d6fc62 100644 --- a/test/lit/passes/constraint-analysis-loops.wast +++ b/test/lit/passes/constraint-analysis-loops.wast @@ -1475,4 +1475,17 @@ ) ) ) + + (func $add-overflow (param $x i32) + (if + (i32.ge_s (local.get $x) (i32.const 0)) + (then + ;; The add here overflows if we are called with MAX_INT. We must + ;; not misoptimize the operation after us to 1 - that is true in all + ;; cases *except* for the add overflowing. + (local.set $x (i32.add (local.get $x) (i32.const 1))) + (drop (i32.gt_s (local.get $x) (i32.const 0))) + ) + ) + ) ) From c66b1bd7fb6ef27fd0f21e45ea781add8d4c23c3 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 18 Aug 2026 08:23:17 -0700 Subject: [PATCH 17/93] go --- src/support/i65.h | 33 ++++++++++++++++++ src/support/span.h | 85 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 src/support/i65.h create mode 100644 src/support/span.h diff --git a/src/support/i65.h b/src/support/i65.h new file mode 100644 index 00000000000..07340c4ff6e --- /dev/null +++ b/src/support/i65.h @@ -0,0 +1,33 @@ +/* + * Copyright 2026 WebAssembly Community Group participants + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef wasm_support_i65_h +#define wasm_support_i65_h + +namespace wasm { + +// A 65-bit integer, capable of representing numbers in the range +// +// std::numeric_limits::min() .. std::numeric_limits::max() +// +// This allows an I65 to represent any 32 or 64-bit number, signed *or* +// unsigned. +struct I65 { +}; + +} // namespace wasm + +#endif // wasm_support_i65_h diff --git a/src/support/span.h b/src/support/span.h new file mode 100644 index 00000000000..e48f67696d2 --- /dev/null +++ b/src/support/span.h @@ -0,0 +1,85 @@ +/* + * Copyright 2026 WebAssembly Community Group participants + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef wasm_support_span_h +#define wasm_support_span_h + +#include "src/support/i65.h" + +namespace wasm { + +// A span of values. +// +// Span{min, max} means [min, max], inclusive of both sides. To represent an +// empty span, we use min > max. +template +struct Span { + T min, max; + + // Set a single value as possible. + void set(T value) { + min = max = value; + } + + // To represent an empty span, we use min > max, an impossible span. + void setEmpty() { + min = 1; + max = 0; + } + + bool isEmpty() const { return min > max; } + + static Span empty() { + Span ret; + ret.setEmpty(); + return ret; + } + + void setFull() { + *this = Span(); + assert(isFull()); + } + + bool isFull() const { return min == Min && max == Max; } + + static Span full() { + Span ret; + ret.setFull(); + return ret; + } + + // Intersect this with another span, returning a (possibly empty) span. + Span intersection(const Span& other) const { + if (isEmpty() || other.isEmpty()) { + return empty(); + } + return Span{std::max(min, other.min), std::min(max, other.max)}; + } + + // Checks whether two spans have any overlap at all. + bool hasOverlap(const Span& other) { + return !intersection(other).isEmpty(); + } + + // Check whether we contain another span (possibly being equal). + bool contains(const Span& other) const { + return intersection(other) == other; + } +}; + +} // namespace wasm + +#endif // wasm_support_span_h From b74ca8ef88d629b032caf80bf6f3ff89b2312ab5 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 18 Aug 2026 08:23:23 -0700 Subject: [PATCH 18/93] go --- src/support/i65.h | 3 +-- src/support/span.h | 11 +++-------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/support/i65.h b/src/support/i65.h index 07340c4ff6e..41b7bebe509 100644 --- a/src/support/i65.h +++ b/src/support/i65.h @@ -25,8 +25,7 @@ namespace wasm { // // This allows an I65 to represent any 32 or 64-bit number, signed *or* // unsigned. -struct I65 { -}; +struct I65 {}; } // namespace wasm diff --git a/src/support/span.h b/src/support/span.h index e48f67696d2..28ada114aba 100644 --- a/src/support/span.h +++ b/src/support/span.h @@ -25,14 +25,11 @@ namespace wasm { // // Span{min, max} means [min, max], inclusive of both sides. To represent an // empty span, we use min > max. -template -struct Span { +template struct Span { T min, max; // Set a single value as possible. - void set(T value) { - min = max = value; - } + void set(T value) { min = max = value; } // To represent an empty span, we use min > max, an impossible span. void setEmpty() { @@ -70,9 +67,7 @@ struct Span { } // Checks whether two spans have any overlap at all. - bool hasOverlap(const Span& other) { - return !intersection(other).isEmpty(); - } + bool hasOverlap(const Span& other) { return !intersection(other).isEmpty(); } // Check whether we contain another span (possibly being equal). bool contains(const Span& other) const { From 01d20c4e8ffd3df71ee036de153f1ac9fc4cc6fe Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 18 Aug 2026 08:35:02 -0700 Subject: [PATCH 19/93] work --- src/support/i65.h | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/support/i65.h b/src/support/i65.h index 41b7bebe509..ddf3c22076b 100644 --- a/src/support/i65.h +++ b/src/support/i65.h @@ -17,6 +17,8 @@ #ifndef wasm_support_i65_h #define wasm_support_i65_h +#include + namespace wasm { // A 65-bit integer, capable of representing numbers in the range @@ -25,7 +27,38 @@ namespace wasm { // // This allows an I65 to represent any 32 or 64-bit number, signed *or* // unsigned. -struct I65 {}; +struct I65 { + // A 64-bit payload with an extra 65th sign bit. + uint64_t value = 0; + bool negative = false; + + // Unsigned values are simple. + I65(uint32_t x) : value(x) {} + I65(uint64_t x) : value(x) {} + + // Signed values need to be checked for being negative. + I65(int32_t x) { + if (x >= 0) { + value = x; + } else { + negative = true; + value = -int64_t(x); + } + } + I65(int64_t x) { + if (x >= 0) { + value = x; + } else { + negative = true; + + // We cannot simply negate MIN_INT64. + if (x == std::numeric_limits::min()) { + value = uint64_t(1) << 31; + } else { + value = -int64_t(x); + } + } + } } // namespace wasm From 71a0a255fc5021976c9568316697ee4f4af2c5f0 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 18 Aug 2026 08:38:28 -0700 Subject: [PATCH 20/93] work --- src/support/i65.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/support/i65.h b/src/support/i65.h index ddf3c22076b..452b63c65c6 100644 --- a/src/support/i65.h +++ b/src/support/i65.h @@ -60,6 +60,32 @@ struct I65 { } } + bool operator==(const I65& other) const { + return value == other.value && negative == other.negative; + } + bool operator!=(const I65& other) const { + return !(*this == other); + } + + bool operator<(const I65& other) const { + if (negative) { + if (other.negative) { + // Both negative; we are smaller if absolute value is larger. + return value > other.value; + } else { + // Only we are negative, so we are smaller. + return true; + } + } else { + if (other.negative) { + // Only the other is negative, so we are larger. + return false; + } else { + // Both positive; we are smaller if absolute value is smaller. + return value < other.value; + } + } + } } // namespace wasm #endif // wasm_support_i65_h From 553a48171b6b5fc82c165b6efd92dae8bc0f9d60 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 18 Aug 2026 08:39:26 -0700 Subject: [PATCH 21/93] work --- src/support/i65.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/support/i65.h b/src/support/i65.h index 452b63c65c6..8a35819a1ca 100644 --- a/src/support/i65.h +++ b/src/support/i65.h @@ -86,6 +86,15 @@ struct I65 { } } } + bool operator<=(const I65& other) const { + return *this < other || *this == other; + } + bool operator>(const I65& other) const { + return !(*this <= other); + } + bool operator>=(const I65& other) const { + return !(*this < other); + } } // namespace wasm #endif // wasm_support_i65_h From df402c9a03a6c742e9fc1eb97ffdd80a84d9d5e5 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 18 Aug 2026 08:40:42 -0700 Subject: [PATCH 22/93] work --- src/support/i65.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/support/i65.h b/src/support/i65.h index 8a35819a1ca..a7c1d065c50 100644 --- a/src/support/i65.h +++ b/src/support/i65.h @@ -51,7 +51,7 @@ struct I65 { } else { negative = true; - // We cannot simply negate MIN_INT64. + // One does not simply negate MIN_INT64. if (x == std::numeric_limits::min()) { value = uint64_t(1) << 31; } else { From 19fc7087c26a253da8df7e355e3918b8f77f6a8b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 18 Aug 2026 09:12:54 -0700 Subject: [PATCH 23/93] changes so far --- src/support/i65.h | 76 ++++++-- src/support/span.h | 38 +++- test/gtest/CMakeLists.txt | 2 + test/gtest/i65.cpp | 259 +++++++++++++++++++++++++++ test/gtest/span.cpp | 361 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 721 insertions(+), 15 deletions(-) create mode 100644 test/gtest/i65.cpp create mode 100644 test/gtest/span.cpp diff --git a/src/support/i65.h b/src/support/i65.h index a7c1d065c50..53953da0032 100644 --- a/src/support/i65.h +++ b/src/support/i65.h @@ -17,6 +17,8 @@ #ifndef wasm_support_i65_h #define wasm_support_i65_h +#include +#include #include namespace wasm { @@ -32,12 +34,14 @@ struct I65 { uint64_t value = 0; bool negative = false; + constexpr I65() = default; + // Unsigned values are simple. - I65(uint32_t x) : value(x) {} - I65(uint64_t x) : value(x) {} + constexpr I65(uint32_t x) : value(x) {} + constexpr I65(uint64_t x) : value(x) {} // Signed values need to be checked for being negative. - I65(int32_t x) { + constexpr I65(int32_t x) { if (x >= 0) { value = x; } else { @@ -45,7 +49,7 @@ struct I65 { value = -int64_t(x); } } - I65(int64_t x) { + constexpr I65(int64_t x) { if (x >= 0) { value = x; } else { @@ -53,21 +57,21 @@ struct I65 { // One does not simply negate MIN_INT64. if (x == std::numeric_limits::min()) { - value = uint64_t(1) << 31; + value = uint64_t(1) << 63; } else { value = -int64_t(x); } } } - bool operator==(const I65& other) const { + constexpr bool operator==(const I65& other) const { return value == other.value && negative == other.negative; } - bool operator!=(const I65& other) const { + constexpr bool operator!=(const I65& other) const { return !(*this == other); } - bool operator<(const I65& other) const { + constexpr bool operator<(const I65& other) const { if (negative) { if (other.negative) { // Both negative; we are smaller if absolute value is larger. @@ -86,15 +90,65 @@ struct I65 { } } } - bool operator<=(const I65& other) const { + constexpr bool operator<=(const I65& other) const { return *this < other || *this == other; } - bool operator>(const I65& other) const { + constexpr bool operator>(const I65& other) const { return !(*this <= other); } - bool operator>=(const I65& other) const { + constexpr bool operator>=(const I65& other) const { return !(*this < other); } +}; + +inline std::ostream& operator<<(std::ostream& os, const I65& x) { + if (x.negative) { + os << '-'; + } + return os << x.value; +} + } // namespace wasm +namespace std { + +template<> class numeric_limits { +public: + static constexpr bool is_specialized = true; + static constexpr bool is_signed = true; + static constexpr bool is_integer = true; + static constexpr bool is_exact = true; + static constexpr bool has_infinity = false; + static constexpr bool has_quiet_NaN = false; + static constexpr bool has_signaling_NaN = false; + static constexpr float_denorm_style has_denorm = denorm_absent; + static constexpr bool has_denorm_loss = false; + static constexpr float_round_style round_style = round_toward_zero; + static constexpr bool is_iec559 = false; + static constexpr bool is_bounded = true; + static constexpr bool is_modulo = false; + static constexpr int digits = 65; + static constexpr int digits10 = 19; + static constexpr int max_digits10 = 0; + static constexpr int radix = 2; + static constexpr int min_exponent = 0; + static constexpr int min_exponent10 = 0; + static constexpr int max_exponent = 0; + static constexpr int max_exponent10 = 0; + static constexpr bool traps = false; + static constexpr bool tinyness_before = false; + + static constexpr wasm::I65 min() noexcept { + return wasm::I65(std::numeric_limits::min()); + } + static constexpr wasm::I65 lowest() noexcept { + return min(); + } + static constexpr wasm::I65 max() noexcept { + return wasm::I65(std::numeric_limits::max()); + } +}; + +} // namespace std + #endif // wasm_support_i65_h diff --git a/src/support/span.h b/src/support/span.h index 28ada114aba..6c55950a16f 100644 --- a/src/support/span.h +++ b/src/support/span.h @@ -17,16 +17,28 @@ #ifndef wasm_support_span_h #define wasm_support_span_h -#include "src/support/i65.h" +#include +#include +#include +#include + +#include "support/i65.h" namespace wasm { -// A span of values. +// A span of values. // // Span{min, max} means [min, max], inclusive of both sides. To represent an // empty span, we use min > max. template struct Span { - T min, max; + static constexpr T Min = std::numeric_limits::lowest(); + static constexpr T Max = std::numeric_limits::max(); + + T min = Min; + T max = Max; + + constexpr Span() = default; + constexpr Span(T min, T max) : min(min), max(max) {} // Set a single value as possible. void set(T value) { min = max = value; } @@ -67,14 +79,32 @@ template struct Span { } // Checks whether two spans have any overlap at all. - bool hasOverlap(const Span& other) { return !intersection(other).isEmpty(); } + bool hasOverlap(const Span& other) const { return !intersection(other).isEmpty(); } // Check whether we contain another span (possibly being equal). bool contains(const Span& other) const { return intersection(other) == other; } + + bool operator==(const Span& other) const { + if (isEmpty()) { + return other.isEmpty(); + } + return !other.isEmpty() && min == other.min && max == other.max; + } + bool operator!=(const Span& other) const { + return !(*this == other); + } }; +template +inline std::ostream& operator<<(std::ostream& os, const Span& span) { + if (span.isEmpty()) { + return os << "[empty]"; + } + return os << '[' << span.min << ", " << span.max << ']'; +} + } // namespace wasm #endif // wasm_support_span_h diff --git a/test/gtest/CMakeLists.txt b/test/gtest/CMakeLists.txt index ab49c49f438..13b304b5671 100644 --- a/test/gtest/CMakeLists.txt +++ b/test/gtest/CMakeLists.txt @@ -17,6 +17,7 @@ set(unittest_SOURCES disjoint_sets.cpp graph.cpp int128.cpp + i65.cpp leaves.cpp glbs.cpp inplace_vector.cpp @@ -31,6 +32,7 @@ set(unittest_SOURCES printing.cpp public-type-validator.cpp scc.cpp + span.cpp stringify.cpp subtype-exprs.cpp suffix_tree.cpp diff --git a/test/gtest/i65.cpp b/test/gtest/i65.cpp new file mode 100644 index 00000000000..cb4874775bd --- /dev/null +++ b/test/gtest/i65.cpp @@ -0,0 +1,259 @@ +/* + * Copyright 2026 WebAssembly Community Group participants + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include + +#include "support/i65.h" +#include "gtest/gtest.h" + +using namespace wasm; + +TEST(I65Test, DefaultConstruct) { + I65 x; + EXPECT_EQ(x.value, 0u); + EXPECT_FALSE(x.negative); + EXPECT_EQ(x, I65(0)); +} + +TEST(I65Test, ConstructFromUnsigned32) { + uint32_t zero = 0; + uint32_t one = 1; + uint32_t mid = 12345678; + uint32_t maxU32 = std::numeric_limits::max(); + + I65 iZero(zero); + EXPECT_EQ(iZero.value, 0u); + EXPECT_FALSE(iZero.negative); + + I65 iOne(one); + EXPECT_EQ(iOne.value, 1u); + EXPECT_FALSE(iOne.negative); + + I65 iMid(mid); + EXPECT_EQ(iMid.value, mid); + EXPECT_FALSE(iMid.negative); + + I65 iMax(maxU32); + EXPECT_EQ(iMax.value, uint64_t(maxU32)); + EXPECT_FALSE(iMax.negative); +} + +TEST(I65Test, ConstructFromSigned32) { + int32_t zero = 0; + int32_t one = 1; + int32_t maxI32 = std::numeric_limits::max(); + int32_t negOne = -1; + int32_t negMid = -12345678; + int32_t minI32 = std::numeric_limits::min(); + + I65 iZero(zero); + EXPECT_EQ(iZero.value, 0u); + EXPECT_FALSE(iZero.negative); + + I65 iOne(one); + EXPECT_EQ(iOne.value, 1u); + EXPECT_FALSE(iOne.negative); + + I65 iMax(maxI32); + EXPECT_EQ(iMax.value, uint64_t(maxI32)); + EXPECT_FALSE(iMax.negative); + + I65 iNegOne(negOne); + EXPECT_EQ(iNegOne.value, 1u); + EXPECT_TRUE(iNegOne.negative); + + I65 iNegMid(negMid); + EXPECT_EQ(iNegMid.value, 12345678u); + EXPECT_TRUE(iNegMid.negative); + + I65 iMin(minI32); + EXPECT_EQ(iMin.value, 2147483648ULL); + EXPECT_TRUE(iMin.negative); +} + +TEST(I65Test, ConstructFromUnsigned64) { + uint64_t zero = 0; + uint64_t one = 1; + uint64_t maxU32 = std::numeric_limits::max(); + uint64_t maxI64 = std::numeric_limits::max(); + uint64_t highBitOnly = uint64_t(1) << 63; + uint64_t maxU64 = std::numeric_limits::max(); + + I65 iZero(zero); + EXPECT_EQ(iZero.value, 0u); + EXPECT_FALSE(iZero.negative); + + I65 iOne(one); + EXPECT_EQ(iOne.value, 1u); + EXPECT_FALSE(iOne.negative); + + I65 iMaxU32(maxU32); + EXPECT_EQ(iMaxU32.value, maxU32); + EXPECT_FALSE(iMaxU32.negative); + + I65 iMaxI64(maxI64); + EXPECT_EQ(iMaxI64.value, maxI64); + EXPECT_FALSE(iMaxI64.negative); + + I65 iHighBit(highBitOnly); + EXPECT_EQ(iHighBit.value, highBitOnly); + EXPECT_FALSE(iHighBit.negative); + + I65 iMaxU64(maxU64); + EXPECT_EQ(iMaxU64.value, maxU64); + EXPECT_FALSE(iMaxU64.negative); +} + +TEST(I65Test, ConstructFromSigned64) { + int64_t zero = 0; + int64_t one = 1; + int64_t maxI64 = std::numeric_limits::max(); + int64_t negOne = -1; + int64_t minI64 = std::numeric_limits::min(); + int64_t minI64PlusOne = std::numeric_limits::min() + 1; + + I65 iZero(zero); + EXPECT_EQ(iZero.value, 0u); + EXPECT_FALSE(iZero.negative); + + I65 iOne(one); + EXPECT_EQ(iOne.value, 1u); + EXPECT_FALSE(iOne.negative); + + I65 iMax(maxI64); + EXPECT_EQ(iMax.value, uint64_t(maxI64)); + EXPECT_FALSE(iMax.negative); + + I65 iNegOne(negOne); + EXPECT_EQ(iNegOne.value, 1u); + EXPECT_TRUE(iNegOne.negative); + + I65 iMin(minI64); + EXPECT_EQ(iMin.value, uint64_t(1) << 63); + EXPECT_TRUE(iMin.negative); + + I65 iMinPlusOne(minI64PlusOne); + EXPECT_EQ(iMinPlusOne.value, uint64_t(std::numeric_limits::max())); + EXPECT_TRUE(iMinPlusOne.negative); +} + +TEST(I65Test, EqualityAndInequality) { + EXPECT_EQ(I65(int32_t(0)), I65(uint32_t(0))); + EXPECT_EQ(I65(int32_t(0)), I65(int64_t(0))); + EXPECT_EQ(I65(int32_t(0)), I65(uint64_t(0))); + + EXPECT_EQ(I65(int32_t(42)), I65(uint32_t(42))); + EXPECT_EQ(I65(int32_t(42)), I65(int64_t(42))); + EXPECT_EQ(I65(int32_t(42)), I65(uint64_t(42))); + + EXPECT_EQ(I65(int32_t(-42)), I65(int64_t(-42))); + EXPECT_EQ(I65(std::numeric_limits::min()), + I65(int64_t(std::numeric_limits::min()))); + + EXPECT_NE(I65(int32_t(1)), I65(int32_t(-1))); + EXPECT_NE(I65(uint64_t(0xffffffffffffffffULL)), I65(int64_t(-1))); + EXPECT_NE(I65(std::numeric_limits::min()), + I65(uint64_t(1) << 63)); +} + +TEST(I65Test, TotalOrdering) { + std::vector sortedValues = { + I65(std::numeric_limits::min()), + I65(std::numeric_limits::min() + 1), + I65(int64_t(-0x100000000LL)), + I65(std::numeric_limits::min()), + I65(int32_t(-12345)), + I65(int64_t(-2)), + I65(int64_t(-1)), + I65(0), + I65(1), + I65(2), + I65(int32_t(12345)), + I65(std::numeric_limits::max()), + I65(uint64_t(std::numeric_limits::max()) + 1), + I65(std::numeric_limits::max()), + I65(uint64_t(std::numeric_limits::max()) + 1), + I65(std::numeric_limits::max() - 1), + I65(std::numeric_limits::max()), + I65(uint64_t(std::numeric_limits::max()) + 1), + I65(std::numeric_limits::max() - 1), + I65(std::numeric_limits::max()), + }; + + for (size_t i = 0; i < sortedValues.size(); ++i) { + for (size_t j = 0; j < sortedValues.size(); ++j) { + const auto& a = sortedValues[i]; + const auto& b = sortedValues[j]; + + if (i < j) { + EXPECT_LT(a, b); + EXPECT_LE(a, b); + EXPECT_GT(b, a); + EXPECT_GE(b, a); + EXPECT_NE(a, b); + EXPECT_FALSE(a == b); + EXPECT_FALSE(b < a); + } else if (i == j) { + EXPECT_EQ(a, b); + EXPECT_LE(a, b); + EXPECT_GE(a, b); + EXPECT_FALSE(a < b); + EXPECT_FALSE(a > b); + EXPECT_FALSE(a != b); + } else { + EXPECT_GT(a, b); + EXPECT_GE(a, b); + EXPECT_LT(b, a); + EXPECT_LE(b, a); + EXPECT_NE(a, b); + EXPECT_FALSE(a == b); + EXPECT_FALSE(a < b); + } + } + } +} + +TEST(I65Test, NumericLimits) { + EXPECT_TRUE(std::numeric_limits::is_specialized); + EXPECT_TRUE(std::numeric_limits::is_signed); + EXPECT_TRUE(std::numeric_limits::is_integer); + + EXPECT_EQ(std::numeric_limits::min(), + I65(std::numeric_limits::min())); + EXPECT_EQ(std::numeric_limits::lowest(), + I65(std::numeric_limits::min())); + EXPECT_EQ(std::numeric_limits::max(), + I65(std::numeric_limits::max())); +} + +TEST(I65Test, StreamOutput) { + auto toString = [](const I65& x) { + std::ostringstream ss; + ss << x; + return ss.str(); + }; + + EXPECT_EQ(toString(I65(0)), "0"); + EXPECT_EQ(toString(I65(42)), "42"); + EXPECT_EQ(toString(I65(-42)), "-42"); + EXPECT_EQ(toString(I65(std::numeric_limits::min())), + "-9223372036854775808"); + EXPECT_EQ(toString(I65(std::numeric_limits::max())), + "18446744073709551615"); +} diff --git a/test/gtest/span.cpp b/test/gtest/span.cpp new file mode 100644 index 00000000000..02613dde08f --- /dev/null +++ b/test/gtest/span.cpp @@ -0,0 +1,361 @@ +/* + * Copyright 2026 WebAssembly Community Group participants + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include "support/i65.h" +#include "support/span.h" +#include "gtest/gtest.h" + +using namespace wasm; + +// ============================================================================ +// Generic Span tests +// ============================================================================ + +TEST(SpanTest, EmptySpanInt) { + Span empty = Span::empty(); + EXPECT_TRUE(empty.isEmpty()); + EXPECT_FALSE(empty.isFull()); + + Span invalid(10, 5); + EXPECT_TRUE(invalid.isEmpty()); + EXPECT_FALSE(invalid.isFull()); + + EXPECT_EQ(empty, invalid); + + Span s; + EXPECT_FALSE(s.isEmpty()); + s.setEmpty(); + EXPECT_TRUE(s.isEmpty()); + EXPECT_EQ(s, empty); +} + +TEST(SpanTest, FullSpanIntTypes) { + // Signed 32-bit + Span fullI32 = Span::full(); + EXPECT_TRUE(fullI32.isFull()); + EXPECT_FALSE(fullI32.isEmpty()); + EXPECT_EQ(fullI32.min, std::numeric_limits::min()); + EXPECT_EQ(fullI32.max, std::numeric_limits::max()); + + Span defI32; + EXPECT_TRUE(defI32.isFull()); + EXPECT_EQ(defI32, fullI32); + + // Unsigned 32-bit + Span fullU32 = Span::full(); + EXPECT_TRUE(fullU32.isFull()); + EXPECT_FALSE(fullU32.isEmpty()); + EXPECT_EQ(fullU32.min, 0u); + EXPECT_EQ(fullU32.max, std::numeric_limits::max()); + + // Signed 64-bit + Span fullI64 = Span::full(); + EXPECT_TRUE(fullI64.isFull()); + EXPECT_FALSE(fullI64.isEmpty()); + EXPECT_EQ(fullI64.min, std::numeric_limits::min()); + EXPECT_EQ(fullI64.max, std::numeric_limits::max()); + + // Unsigned 64-bit + Span fullU64 = Span::full(); + EXPECT_TRUE(fullU64.isFull()); + EXPECT_FALSE(fullU64.isEmpty()); + EXPECT_EQ(fullU64.min, 0ull); + EXPECT_EQ(fullU64.max, std::numeric_limits::max()); +} + +TEST(SpanTest, SetSingleValue) { + Span s; + s.set(42); + EXPECT_EQ(s.min, 42); + EXPECT_EQ(s.max, 42); + EXPECT_FALSE(s.isEmpty()); + EXPECT_FALSE(s.isFull()); + EXPECT_EQ(s, Span(42, 42)); +} + +TEST(SpanTest, SetFull) { + Span s(10, 20); + EXPECT_FALSE(s.isFull()); + s.setFull(); + EXPECT_TRUE(s.isFull()); + EXPECT_EQ(s.min, std::numeric_limits::min()); + EXPECT_EQ(s.max, std::numeric_limits::max()); +} + +TEST(SpanTest, IntersectionInt) { + Span a(1, 10); + Span b(5, 15); + Span ab = a.intersection(b); + EXPECT_EQ(ab, Span(5, 10)); + + // Commutativity + EXPECT_EQ(b.intersection(a), Span(5, 10)); + + // Touching at a single point + Span c(10, 20); + EXPECT_EQ(a.intersection(c), Span(10, 10)); + + // Disjoint + Span d(11, 20); + EXPECT_TRUE(a.intersection(d).isEmpty()); + EXPECT_EQ(a.intersection(d), Span::empty()); + + // Contained + Span e(3, 7); + EXPECT_EQ(a.intersection(e), Span(3, 7)); + + // Identical + EXPECT_EQ(a.intersection(a), a); + + // With empty + EXPECT_TRUE(a.intersection(Span::empty()).isEmpty()); + EXPECT_TRUE(Span::empty().intersection(a).isEmpty()); + + // With full + EXPECT_EQ(a.intersection(Span::full()), a); + EXPECT_EQ(Span::full().intersection(a), a); +} + +TEST(SpanTest, HasOverlapInt) { + Span a(1, 10); + Span b(5, 15); + Span c(10, 20); + Span d(11, 20); + + EXPECT_TRUE(a.hasOverlap(b)); + EXPECT_TRUE(b.hasOverlap(a)); + EXPECT_TRUE(a.hasOverlap(c)); + EXPECT_FALSE(a.hasOverlap(d)); + EXPECT_FALSE(d.hasOverlap(a)); + + EXPECT_FALSE(a.hasOverlap(Span::empty())); + EXPECT_TRUE(a.hasOverlap(Span::full())); + EXPECT_FALSE(Span::empty().hasOverlap(Span::full())); +} + +TEST(SpanTest, ContainsInt) { + Span a(1, 10); + Span b(3, 7); + Span c(5, 15); + Span d(11, 20); + + EXPECT_TRUE(a.contains(b)); + EXPECT_FALSE(b.contains(a)); + + EXPECT_TRUE(a.contains(a)); + EXPECT_FALSE(a.contains(c)); + EXPECT_FALSE(a.contains(d)); + + EXPECT_TRUE(a.contains(Span::empty())); + EXPECT_TRUE(Span::empty().contains(Span::empty())); + EXPECT_FALSE(Span::empty().contains(a)); + + EXPECT_TRUE(Span::full().contains(a)); + EXPECT_TRUE(Span::full().contains(Span::empty())); + EXPECT_FALSE(a.contains(Span::full())); +} + +TEST(SpanTest, StreamOutput) { + auto toString = [](const auto& span) { + std::ostringstream ss; + ss << span; + return ss.str(); + }; + + EXPECT_EQ(toString(Span(1, 10)), "[1, 10]"); + EXPECT_EQ(toString(Span::empty()), "[empty]"); + EXPECT_EQ(toString(Span(10, 5)), "[empty]"); +} + +// ============================================================================ +// Span tests (corner cases, sign mixing, large range) +// ============================================================================ + +TEST(SpanI65Test, FullAndLimits) { + EXPECT_EQ(Span::Min, I65(std::numeric_limits::min())); + EXPECT_EQ(Span::Max, I65(std::numeric_limits::max())); + + Span full = Span::full(); + EXPECT_TRUE(full.isFull()); + EXPECT_FALSE(full.isEmpty()); + EXPECT_EQ(full.min, I65(std::numeric_limits::min())); + EXPECT_EQ(full.max, I65(std::numeric_limits::max())); + + // Default constructed span is full + Span def; + EXPECT_TRUE(def.isFull()); + EXPECT_FALSE(def.isEmpty()); + EXPECT_EQ(def, full); +} + +TEST(SpanI65Test, Empty) { + Span empty = Span::empty(); + EXPECT_TRUE(empty.isEmpty()); + EXPECT_FALSE(empty.isFull()); + + Span empty2{I65(100), I65(-100)}; + EXPECT_TRUE(empty2.isEmpty()); + EXPECT_FALSE(empty2.isFull()); + EXPECT_EQ(empty, empty2); + + Span empty3{I65(uint64_t(1)), I65(int64_t(-1))}; + EXPECT_TRUE(empty3.isEmpty()); + EXPECT_EQ(empty, empty3); +} + +TEST(SpanI65Test, SingletonsAtExtremes) { + // Min int64 singleton + Span minI64{I65(std::numeric_limits::min()), + I65(std::numeric_limits::min())}; + EXPECT_FALSE(minI64.isEmpty()); + EXPECT_FALSE(minI64.isFull()); + EXPECT_EQ(minI64.min, I65(std::numeric_limits::min())); + EXPECT_EQ(minI64.max, I65(std::numeric_limits::min())); + + // -1 singleton + Span negOne{I65(-1), I65(-1)}; + EXPECT_FALSE(negOne.isEmpty()); + + // 0 singleton + Span zero{I65(0), I65(0)}; + EXPECT_FALSE(zero.isEmpty()); + + // 1 singleton + Span one{I65(1), I65(1)}; + EXPECT_FALSE(one.isEmpty()); + + // Max int64 singleton + Span maxI64{I65(std::numeric_limits::max()), + I65(std::numeric_limits::max())}; + EXPECT_FALSE(maxI64.isEmpty()); + + // 2^63 singleton (above int64_t max, into uint64_t territory) + Span highBit{I65(uint64_t(1) << 63), I65(uint64_t(1) << 63)}; + EXPECT_FALSE(highBit.isEmpty()); + + // Max uint64 singleton + Span maxU64{I65(std::numeric_limits::max()), + I65(std::numeric_limits::max())}; + EXPECT_FALSE(maxU64.isEmpty()); +} + +TEST(SpanI65Test, CrossingZero) { + Span span{I65(-10), I65(10)}; + EXPECT_FALSE(span.isEmpty()); + EXPECT_FALSE(span.isFull()); + + // Contains points inside + EXPECT_TRUE(span.contains(Span(I65(-10), I65(-10)))); + EXPECT_TRUE(span.contains(Span(I65(-5), I65(5)))); + EXPECT_TRUE(span.contains(Span(I65(0), I65(0)))); + EXPECT_TRUE(span.contains(Span(I65(10), I65(10)))); + + // Does not contain points outside + EXPECT_FALSE(span.contains(Span(I65(-11), I65(-11)))); + EXPECT_FALSE(span.contains(Span(I65(11), I65(11)))); + EXPECT_FALSE(span.contains(Span(I65(-15), I65(5)))); + EXPECT_FALSE(span.contains(Span(I65(-5), I65(15)))); +} + +TEST(SpanI65Test, NegativeAndPositiveIntersections) { + Span neg{I65(-100), I65(-10)}; + Span pos{I65(10), I65(100)}; + + EXPECT_FALSE(neg.hasOverlap(pos)); + EXPECT_FALSE(pos.hasOverlap(neg)); + EXPECT_TRUE(neg.intersection(pos).isEmpty()); + EXPECT_TRUE(pos.intersection(neg).isEmpty()); + + Span touchNegZero{I65(-10), I65(0)}; + Span touchZeroPos{I65(0), I65(10)}; + EXPECT_TRUE(touchNegZero.hasOverlap(touchZeroPos)); + EXPECT_EQ(touchNegZero.intersection(touchZeroPos), Span(I65(0), I65(0))); + + Span overlap{I65(-50), I65(50)}; + EXPECT_EQ(neg.intersection(overlap), Span(I65(-50), I65(-10))); + EXPECT_EQ(pos.intersection(overlap), Span(I65(10), I65(50))); +} + +TEST(SpanI65Test, SignedUnsignedBoundary) { + // Test around INT64_MAX and 2^63 + int64_t maxI64 = std::numeric_limits::max(); + uint64_t highBit = uint64_t(maxI64) + 1; // 0x8000000000000000ULL + + Span s1(I65(maxI64 - 100), I65(highBit + 50)); + Span s2(I65(highBit), I65(highBit + 100)); + + EXPECT_TRUE(s1.hasOverlap(s2)); + EXPECT_EQ(s1.intersection(s2), Span(I65(highBit), I65(highBit + 50))); + + // Disjoint near 2^63 boundary + Span s3{I65(maxI64 - 200), I65(maxI64)}; + Span s4{I65(highBit + 1), I65(highBit + 100)}; + EXPECT_FALSE(s3.hasOverlap(s4)); + EXPECT_TRUE(s3.intersection(s4).isEmpty()); + + // Adjacent touching at 2^63 + Span s5{I65(maxI64), I65(highBit)}; + Span s6{I65(highBit), I65(highBit + 10)}; + EXPECT_TRUE(s5.hasOverlap(s6)); + EXPECT_EQ(s5.intersection(s6), Span(I65(highBit), I65(highBit))); +} + +TEST(SpanI65Test, ExtremeBoundaries) { + Span minPart(I65(std::numeric_limits::min()), + I65(std::numeric_limits::min() + 100)); + Span maxPart(I65(std::numeric_limits::max() - 100), + I65(std::numeric_limits::max())); + + EXPECT_FALSE(minPart.hasOverlap(maxPart)); + EXPECT_TRUE(minPart.intersection(maxPart).isEmpty()); + + Span full = Span::full(); + EXPECT_TRUE(full.contains(minPart)); + EXPECT_TRUE(full.contains(maxPart)); + EXPECT_EQ(full.intersection(minPart), minPart); + EXPECT_EQ(full.intersection(maxPart), maxPart); + EXPECT_TRUE(full.hasOverlap(minPart)); + EXPECT_TRUE(full.hasOverlap(maxPart)); + + Span allNeg(I65(std::numeric_limits::min()), I65(-1)); + Span allNonNeg(I65(0), I65(std::numeric_limits::max())); + + EXPECT_FALSE(allNeg.hasOverlap(allNonNeg)); + EXPECT_TRUE(allNeg.intersection(allNonNeg).isEmpty()); + EXPECT_TRUE(full.contains(allNeg)); + EXPECT_TRUE(full.contains(allNonNeg)); +} + +TEST(SpanI65Test, SetAndMutate) { + Span s; + EXPECT_TRUE(s.isFull()); + + s.set(I65(-12345)); + EXPECT_FALSE(s.isFull()); + EXPECT_FALSE(s.isEmpty()); + EXPECT_EQ(s.min, I65(-12345)); + EXPECT_EQ(s.max, I65(-12345)); + + s.setEmpty(); + EXPECT_TRUE(s.isEmpty()); + + s.setFull(); + EXPECT_TRUE(s.isFull()); +} From b645fabb33b2a6814bd91dbc6ba713a7076d7890 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 18 Aug 2026 09:13:16 -0700 Subject: [PATCH 24/93] format --- src/support/i65.h | 12 +++--------- src/support/span.h | 8 ++++---- test/gtest/i65.cpp | 3 +-- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/support/i65.h b/src/support/i65.h index 53953da0032..305f4e44c22 100644 --- a/src/support/i65.h +++ b/src/support/i65.h @@ -93,12 +93,8 @@ struct I65 { constexpr bool operator<=(const I65& other) const { return *this < other || *this == other; } - constexpr bool operator>(const I65& other) const { - return !(*this <= other); - } - constexpr bool operator>=(const I65& other) const { - return !(*this < other); - } + constexpr bool operator>(const I65& other) const { return !(*this <= other); } + constexpr bool operator>=(const I65& other) const { return !(*this < other); } }; inline std::ostream& operator<<(std::ostream& os, const I65& x) { @@ -141,9 +137,7 @@ template<> class numeric_limits { static constexpr wasm::I65 min() noexcept { return wasm::I65(std::numeric_limits::min()); } - static constexpr wasm::I65 lowest() noexcept { - return min(); - } + static constexpr wasm::I65 lowest() noexcept { return min(); } static constexpr wasm::I65 max() noexcept { return wasm::I65(std::numeric_limits::max()); } diff --git a/src/support/span.h b/src/support/span.h index 6c55950a16f..3b8ea83a8f7 100644 --- a/src/support/span.h +++ b/src/support/span.h @@ -79,7 +79,9 @@ template struct Span { } // Checks whether two spans have any overlap at all. - bool hasOverlap(const Span& other) const { return !intersection(other).isEmpty(); } + bool hasOverlap(const Span& other) const { + return !intersection(other).isEmpty(); + } // Check whether we contain another span (possibly being equal). bool contains(const Span& other) const { @@ -92,9 +94,7 @@ template struct Span { } return !other.isEmpty() && min == other.min && max == other.max; } - bool operator!=(const Span& other) const { - return !(*this == other); - } + bool operator!=(const Span& other) const { return !(*this == other); } }; template diff --git a/test/gtest/i65.cpp b/test/gtest/i65.cpp index cb4874775bd..dd50840d02d 100644 --- a/test/gtest/i65.cpp +++ b/test/gtest/i65.cpp @@ -168,8 +168,7 @@ TEST(I65Test, EqualityAndInequality) { EXPECT_NE(I65(int32_t(1)), I65(int32_t(-1))); EXPECT_NE(I65(uint64_t(0xffffffffffffffffULL)), I65(int64_t(-1))); - EXPECT_NE(I65(std::numeric_limits::min()), - I65(uint64_t(1) << 63)); + EXPECT_NE(I65(std::numeric_limits::min()), I65(uint64_t(1) << 63)); } TEST(I65Test, TotalOrdering) { From b3184eda4d827891dbada0d9fdc8522e4a7a5bba Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 11:05:09 -0700 Subject: [PATCH 25/93] rename --- src/support/{i65.h => iu64.h} | 44 ++++----- test/gtest/{i65.cpp => iu64.cpp} | 164 +++++++++++++++---------------- test/gtest/span.cpp | 134 ++++++++++++------------- 3 files changed, 171 insertions(+), 171 deletions(-) rename src/support/{i65.h => iu64.h} (73%) rename test/gtest/{i65.cpp => iu64.cpp} (57%) diff --git a/src/support/i65.h b/src/support/iu64.h similarity index 73% rename from src/support/i65.h rename to src/support/iu64.h index 305f4e44c22..a6b0bbb980a 100644 --- a/src/support/i65.h +++ b/src/support/iu64.h @@ -23,25 +23,25 @@ namespace wasm { -// A 65-bit integer, capable of representing numbers in the range +// An integer capable of representing numbers in the combined range of 32 and +// 64-bit integers, both signed and unsigned. That is, in the range // // std::numeric_limits::min() .. std::numeric_limits::max() // -// This allows an I65 to represent any 32 or 64-bit number, signed *or* -// unsigned. -struct I65 { +// This is basically an i64 combined with a u64 in terms of range, hence "IU64". +struct IU64 { // A 64-bit payload with an extra 65th sign bit. uint64_t value = 0; bool negative = false; - constexpr I65() = default; + constexpr IU64() = default; // Unsigned values are simple. - constexpr I65(uint32_t x) : value(x) {} - constexpr I65(uint64_t x) : value(x) {} + constexpr IU64(uint32_t x) : value(x) {} + constexpr IU64(uint64_t x) : value(x) {} // Signed values need to be checked for being negative. - constexpr I65(int32_t x) { + constexpr IU64(int32_t x) { if (x >= 0) { value = x; } else { @@ -49,7 +49,7 @@ struct I65 { value = -int64_t(x); } } - constexpr I65(int64_t x) { + constexpr IU64(int64_t x) { if (x >= 0) { value = x; } else { @@ -64,14 +64,14 @@ struct I65 { } } - constexpr bool operator==(const I65& other) const { + constexpr bool operator==(const IU64& other) const { return value == other.value && negative == other.negative; } - constexpr bool operator!=(const I65& other) const { + constexpr bool operator!=(const IU64& other) const { return !(*this == other); } - constexpr bool operator<(const I65& other) const { + constexpr bool operator<(const IU64& other) const { if (negative) { if (other.negative) { // Both negative; we are smaller if absolute value is larger. @@ -90,14 +90,14 @@ struct I65 { } } } - constexpr bool operator<=(const I65& other) const { + constexpr bool operator<=(const IU64& other) const { return *this < other || *this == other; } - constexpr bool operator>(const I65& other) const { return !(*this <= other); } - constexpr bool operator>=(const I65& other) const { return !(*this < other); } + constexpr bool operator>(const IU64& other) const { return !(*this <= other); } + constexpr bool operator>=(const IU64& other) const { return !(*this < other); } }; -inline std::ostream& operator<<(std::ostream& os, const I65& x) { +inline std::ostream& operator<<(std::ostream& os, const IU64& x) { if (x.negative) { os << '-'; } @@ -108,7 +108,7 @@ inline std::ostream& operator<<(std::ostream& os, const I65& x) { namespace std { -template<> class numeric_limits { +template<> class numeric_limits { public: static constexpr bool is_specialized = true; static constexpr bool is_signed = true; @@ -134,12 +134,12 @@ template<> class numeric_limits { static constexpr bool traps = false; static constexpr bool tinyness_before = false; - static constexpr wasm::I65 min() noexcept { - return wasm::I65(std::numeric_limits::min()); + static constexpr wasm::IU64 min() noexcept { + return wasm::IU64(std::numeric_limits::min()); } - static constexpr wasm::I65 lowest() noexcept { return min(); } - static constexpr wasm::I65 max() noexcept { - return wasm::I65(std::numeric_limits::max()); + static constexpr wasm::IU64 lowest() noexcept { return min(); } + static constexpr wasm::IU64 max() noexcept { + return wasm::IU64(std::numeric_limits::max()); } }; diff --git a/test/gtest/i65.cpp b/test/gtest/iu64.cpp similarity index 57% rename from test/gtest/i65.cpp rename to test/gtest/iu64.cpp index dd50840d02d..0c38fcbe799 100644 --- a/test/gtest/i65.cpp +++ b/test/gtest/iu64.cpp @@ -24,37 +24,37 @@ using namespace wasm; -TEST(I65Test, DefaultConstruct) { - I65 x; +TEST(IU64Test, DefaultConstruct) { + IU64 x; EXPECT_EQ(x.value, 0u); EXPECT_FALSE(x.negative); - EXPECT_EQ(x, I65(0)); + EXPECT_EQ(x, IU64(0)); } -TEST(I65Test, ConstructFromUnsigned32) { +TEST(IU64Test, ConstructFromUnsigned32) { uint32_t zero = 0; uint32_t one = 1; uint32_t mid = 12345678; uint32_t maxU32 = std::numeric_limits::max(); - I65 iZero(zero); + IU64 iZero(zero); EXPECT_EQ(iZero.value, 0u); EXPECT_FALSE(iZero.negative); - I65 iOne(one); + IU64 iOne(one); EXPECT_EQ(iOne.value, 1u); EXPECT_FALSE(iOne.negative); - I65 iMid(mid); + IU64 iMid(mid); EXPECT_EQ(iMid.value, mid); EXPECT_FALSE(iMid.negative); - I65 iMax(maxU32); + IU64 iMax(maxU32); EXPECT_EQ(iMax.value, uint64_t(maxU32)); EXPECT_FALSE(iMax.negative); } -TEST(I65Test, ConstructFromSigned32) { +TEST(IU64Test, ConstructFromSigned32) { int32_t zero = 0; int32_t one = 1; int32_t maxI32 = std::numeric_limits::max(); @@ -62,32 +62,32 @@ TEST(I65Test, ConstructFromSigned32) { int32_t negMid = -12345678; int32_t minI32 = std::numeric_limits::min(); - I65 iZero(zero); + IU64 iZero(zero); EXPECT_EQ(iZero.value, 0u); EXPECT_FALSE(iZero.negative); - I65 iOne(one); + IU64 iOne(one); EXPECT_EQ(iOne.value, 1u); EXPECT_FALSE(iOne.negative); - I65 iMax(maxI32); + IU64 iMax(maxI32); EXPECT_EQ(iMax.value, uint64_t(maxI32)); EXPECT_FALSE(iMax.negative); - I65 iNegOne(negOne); + IU64 iNegOne(negOne); EXPECT_EQ(iNegOne.value, 1u); EXPECT_TRUE(iNegOne.negative); - I65 iNegMid(negMid); + IU64 iNegMid(negMid); EXPECT_EQ(iNegMid.value, 12345678u); EXPECT_TRUE(iNegMid.negative); - I65 iMin(minI32); + IU64 iMin(minI32); EXPECT_EQ(iMin.value, 2147483648ULL); EXPECT_TRUE(iMin.negative); } -TEST(I65Test, ConstructFromUnsigned64) { +TEST(IU64Test, ConstructFromUnsigned64) { uint64_t zero = 0; uint64_t one = 1; uint64_t maxU32 = std::numeric_limits::max(); @@ -95,32 +95,32 @@ TEST(I65Test, ConstructFromUnsigned64) { uint64_t highBitOnly = uint64_t(1) << 63; uint64_t maxU64 = std::numeric_limits::max(); - I65 iZero(zero); + IU64 iZero(zero); EXPECT_EQ(iZero.value, 0u); EXPECT_FALSE(iZero.negative); - I65 iOne(one); + IU64 iOne(one); EXPECT_EQ(iOne.value, 1u); EXPECT_FALSE(iOne.negative); - I65 iMaxU32(maxU32); + IU64 iMaxU32(maxU32); EXPECT_EQ(iMaxU32.value, maxU32); EXPECT_FALSE(iMaxU32.negative); - I65 iMaxI64(maxI64); + IU64 iMaxI64(maxI64); EXPECT_EQ(iMaxI64.value, maxI64); EXPECT_FALSE(iMaxI64.negative); - I65 iHighBit(highBitOnly); + IU64 iHighBit(highBitOnly); EXPECT_EQ(iHighBit.value, highBitOnly); EXPECT_FALSE(iHighBit.negative); - I65 iMaxU64(maxU64); + IU64 iMaxU64(maxU64); EXPECT_EQ(iMaxU64.value, maxU64); EXPECT_FALSE(iMaxU64.negative); } -TEST(I65Test, ConstructFromSigned64) { +TEST(IU64Test, ConstructFromSigned64) { int64_t zero = 0; int64_t one = 1; int64_t maxI64 = std::numeric_limits::max(); @@ -128,71 +128,71 @@ TEST(I65Test, ConstructFromSigned64) { int64_t minI64 = std::numeric_limits::min(); int64_t minI64PlusOne = std::numeric_limits::min() + 1; - I65 iZero(zero); + IU64 iZero(zero); EXPECT_EQ(iZero.value, 0u); EXPECT_FALSE(iZero.negative); - I65 iOne(one); + IU64 iOne(one); EXPECT_EQ(iOne.value, 1u); EXPECT_FALSE(iOne.negative); - I65 iMax(maxI64); + IU64 iMax(maxI64); EXPECT_EQ(iMax.value, uint64_t(maxI64)); EXPECT_FALSE(iMax.negative); - I65 iNegOne(negOne); + IU64 iNegOne(negOne); EXPECT_EQ(iNegOne.value, 1u); EXPECT_TRUE(iNegOne.negative); - I65 iMin(minI64); + IU64 iMin(minI64); EXPECT_EQ(iMin.value, uint64_t(1) << 63); EXPECT_TRUE(iMin.negative); - I65 iMinPlusOne(minI64PlusOne); + IU64 iMinPlusOne(minI64PlusOne); EXPECT_EQ(iMinPlusOne.value, uint64_t(std::numeric_limits::max())); EXPECT_TRUE(iMinPlusOne.negative); } -TEST(I65Test, EqualityAndInequality) { - EXPECT_EQ(I65(int32_t(0)), I65(uint32_t(0))); - EXPECT_EQ(I65(int32_t(0)), I65(int64_t(0))); - EXPECT_EQ(I65(int32_t(0)), I65(uint64_t(0))); +TEST(IU64Test, EqualityAndInequality) { + EXPECT_EQ(IU64(int32_t(0)), IU64(uint32_t(0))); + EXPECT_EQ(IU64(int32_t(0)), IU64(int64_t(0))); + EXPECT_EQ(IU64(int32_t(0)), IU64(uint64_t(0))); - EXPECT_EQ(I65(int32_t(42)), I65(uint32_t(42))); - EXPECT_EQ(I65(int32_t(42)), I65(int64_t(42))); - EXPECT_EQ(I65(int32_t(42)), I65(uint64_t(42))); + EXPECT_EQ(IU64(int32_t(42)), IU64(uint32_t(42))); + EXPECT_EQ(IU64(int32_t(42)), IU64(int64_t(42))); + EXPECT_EQ(IU64(int32_t(42)), IU64(uint64_t(42))); - EXPECT_EQ(I65(int32_t(-42)), I65(int64_t(-42))); - EXPECT_EQ(I65(std::numeric_limits::min()), - I65(int64_t(std::numeric_limits::min()))); + EXPECT_EQ(IU64(int32_t(-42)), IU64(int64_t(-42))); + EXPECT_EQ(IU64(std::numeric_limits::min()), + IU64(int64_t(std::numeric_limits::min()))); - EXPECT_NE(I65(int32_t(1)), I65(int32_t(-1))); - EXPECT_NE(I65(uint64_t(0xffffffffffffffffULL)), I65(int64_t(-1))); - EXPECT_NE(I65(std::numeric_limits::min()), I65(uint64_t(1) << 63)); + EXPECT_NE(IU64(int32_t(1)), IU64(int32_t(-1))); + EXPECT_NE(IU64(uint64_t(0xffffffffffffffffULL)), IU64(int64_t(-1))); + EXPECT_NE(IU64(std::numeric_limits::min()), IU64(uint64_t(1) << 63)); } -TEST(I65Test, TotalOrdering) { - std::vector sortedValues = { - I65(std::numeric_limits::min()), - I65(std::numeric_limits::min() + 1), - I65(int64_t(-0x100000000LL)), - I65(std::numeric_limits::min()), - I65(int32_t(-12345)), - I65(int64_t(-2)), - I65(int64_t(-1)), - I65(0), - I65(1), - I65(2), - I65(int32_t(12345)), - I65(std::numeric_limits::max()), - I65(uint64_t(std::numeric_limits::max()) + 1), - I65(std::numeric_limits::max()), - I65(uint64_t(std::numeric_limits::max()) + 1), - I65(std::numeric_limits::max() - 1), - I65(std::numeric_limits::max()), - I65(uint64_t(std::numeric_limits::max()) + 1), - I65(std::numeric_limits::max() - 1), - I65(std::numeric_limits::max()), +TEST(IU64Test, TotalOrdering) { + std::vector sortedValues = { + IU64(std::numeric_limits::min()), + IU64(std::numeric_limits::min() + 1), + IU64(int64_t(-0x100000000LL)), + IU64(std::numeric_limits::min()), + IU64(int32_t(-12345)), + IU64(int64_t(-2)), + IU64(int64_t(-1)), + IU64(0), + IU64(1), + IU64(2), + IU64(int32_t(12345)), + IU64(std::numeric_limits::max()), + IU64(uint64_t(std::numeric_limits::max()) + 1), + IU64(std::numeric_limits::max()), + IU64(uint64_t(std::numeric_limits::max()) + 1), + IU64(std::numeric_limits::max() - 1), + IU64(std::numeric_limits::max()), + IU64(uint64_t(std::numeric_limits::max()) + 1), + IU64(std::numeric_limits::max() - 1), + IU64(std::numeric_limits::max()), }; for (size_t i = 0; i < sortedValues.size(); ++i) { @@ -228,31 +228,31 @@ TEST(I65Test, TotalOrdering) { } } -TEST(I65Test, NumericLimits) { - EXPECT_TRUE(std::numeric_limits::is_specialized); - EXPECT_TRUE(std::numeric_limits::is_signed); - EXPECT_TRUE(std::numeric_limits::is_integer); - - EXPECT_EQ(std::numeric_limits::min(), - I65(std::numeric_limits::min())); - EXPECT_EQ(std::numeric_limits::lowest(), - I65(std::numeric_limits::min())); - EXPECT_EQ(std::numeric_limits::max(), - I65(std::numeric_limits::max())); +TEST(IU64Test, NumericLimits) { + EXPECT_TRUE(std::numeric_limits::is_specialized); + EXPECT_TRUE(std::numeric_limits::is_signed); + EXPECT_TRUE(std::numeric_limits::is_integer); + + EXPECT_EQ(std::numeric_limits::min(), + IU64(std::numeric_limits::min())); + EXPECT_EQ(std::numeric_limits::lowest(), + IU64(std::numeric_limits::min())); + EXPECT_EQ(std::numeric_limits::max(), + IU64(std::numeric_limits::max())); } -TEST(I65Test, StreamOutput) { - auto toString = [](const I65& x) { +TEST(IU64Test, StreamOutput) { + auto toString = [](const IU64& x) { std::ostringstream ss; ss << x; return ss.str(); }; - EXPECT_EQ(toString(I65(0)), "0"); - EXPECT_EQ(toString(I65(42)), "42"); - EXPECT_EQ(toString(I65(-42)), "-42"); - EXPECT_EQ(toString(I65(std::numeric_limits::min())), + EXPECT_EQ(toString(IU64(0)), "0"); + EXPECT_EQ(toString(IU64(42)), "42"); + EXPECT_EQ(toString(IU64(-42)), "-42"); + EXPECT_EQ(toString(IU64(std::numeric_limits::min())), "-9223372036854775808"); - EXPECT_EQ(toString(I65(std::numeric_limits::max())), + EXPECT_EQ(toString(IU64(std::numeric_limits::max())), "18446744073709551615"); } diff --git a/test/gtest/span.cpp b/test/gtest/span.cpp index 02613dde08f..72ff18d2704 100644 --- a/test/gtest/span.cpp +++ b/test/gtest/span.cpp @@ -18,7 +18,7 @@ #include #include -#include "support/i65.h" +#include "support/iu64.h" #include "support/span.h" #include "gtest/gtest.h" @@ -185,148 +185,148 @@ TEST(SpanTest, StreamOutput) { } // ============================================================================ -// Span tests (corner cases, sign mixing, large range) +// Span tests (corner cases, sign mixing, large range) // ============================================================================ -TEST(SpanI65Test, FullAndLimits) { - EXPECT_EQ(Span::Min, I65(std::numeric_limits::min())); - EXPECT_EQ(Span::Max, I65(std::numeric_limits::max())); +TEST(SpanIU64Test, FullAndLimits) { + EXPECT_EQ(Span::Min, IU64(std::numeric_limits::min())); + EXPECT_EQ(Span::Max, IU64(std::numeric_limits::max())); - Span full = Span::full(); + Span full = Span::full(); EXPECT_TRUE(full.isFull()); EXPECT_FALSE(full.isEmpty()); - EXPECT_EQ(full.min, I65(std::numeric_limits::min())); - EXPECT_EQ(full.max, I65(std::numeric_limits::max())); + EXPECT_EQ(full.min, IU64(std::numeric_limits::min())); + EXPECT_EQ(full.max, IU64(std::numeric_limits::max())); // Default constructed span is full - Span def; + Span def; EXPECT_TRUE(def.isFull()); EXPECT_FALSE(def.isEmpty()); EXPECT_EQ(def, full); } -TEST(SpanI65Test, Empty) { - Span empty = Span::empty(); +TEST(SpanIU64Test, Empty) { + Span empty = Span::empty(); EXPECT_TRUE(empty.isEmpty()); EXPECT_FALSE(empty.isFull()); - Span empty2{I65(100), I65(-100)}; + Span empty2{IU64(100), IU64(-100)}; EXPECT_TRUE(empty2.isEmpty()); EXPECT_FALSE(empty2.isFull()); EXPECT_EQ(empty, empty2); - Span empty3{I65(uint64_t(1)), I65(int64_t(-1))}; + Span empty3{IU64(uint64_t(1)), IU64(int64_t(-1))}; EXPECT_TRUE(empty3.isEmpty()); EXPECT_EQ(empty, empty3); } -TEST(SpanI65Test, SingletonsAtExtremes) { +TEST(SpanIU64Test, SingletonsAtExtremes) { // Min int64 singleton - Span minI64{I65(std::numeric_limits::min()), - I65(std::numeric_limits::min())}; + Span minI64{IU64(std::numeric_limits::min()), + IU64(std::numeric_limits::min())}; EXPECT_FALSE(minI64.isEmpty()); EXPECT_FALSE(minI64.isFull()); - EXPECT_EQ(minI64.min, I65(std::numeric_limits::min())); - EXPECT_EQ(minI64.max, I65(std::numeric_limits::min())); + EXPECT_EQ(minI64.min, IU64(std::numeric_limits::min())); + EXPECT_EQ(minI64.max, IU64(std::numeric_limits::min())); // -1 singleton - Span negOne{I65(-1), I65(-1)}; + Span negOne{IU64(-1), IU64(-1)}; EXPECT_FALSE(negOne.isEmpty()); // 0 singleton - Span zero{I65(0), I65(0)}; + Span zero{IU64(0), IU64(0)}; EXPECT_FALSE(zero.isEmpty()); // 1 singleton - Span one{I65(1), I65(1)}; + Span one{IU64(1), IU64(1)}; EXPECT_FALSE(one.isEmpty()); // Max int64 singleton - Span maxI64{I65(std::numeric_limits::max()), - I65(std::numeric_limits::max())}; + Span maxI64{IU64(std::numeric_limits::max()), + IU64(std::numeric_limits::max())}; EXPECT_FALSE(maxI64.isEmpty()); // 2^63 singleton (above int64_t max, into uint64_t territory) - Span highBit{I65(uint64_t(1) << 63), I65(uint64_t(1) << 63)}; + Span highBit{IU64(uint64_t(1) << 63), IU64(uint64_t(1) << 63)}; EXPECT_FALSE(highBit.isEmpty()); // Max uint64 singleton - Span maxU64{I65(std::numeric_limits::max()), - I65(std::numeric_limits::max())}; + Span maxU64{IU64(std::numeric_limits::max()), + IU64(std::numeric_limits::max())}; EXPECT_FALSE(maxU64.isEmpty()); } -TEST(SpanI65Test, CrossingZero) { - Span span{I65(-10), I65(10)}; +TEST(SpanIU64Test, CrossingZero) { + Span span{IU64(-10), IU64(10)}; EXPECT_FALSE(span.isEmpty()); EXPECT_FALSE(span.isFull()); // Contains points inside - EXPECT_TRUE(span.contains(Span(I65(-10), I65(-10)))); - EXPECT_TRUE(span.contains(Span(I65(-5), I65(5)))); - EXPECT_TRUE(span.contains(Span(I65(0), I65(0)))); - EXPECT_TRUE(span.contains(Span(I65(10), I65(10)))); + EXPECT_TRUE(span.contains(Span(IU64(-10), IU64(-10)))); + EXPECT_TRUE(span.contains(Span(IU64(-5), IU64(5)))); + EXPECT_TRUE(span.contains(Span(IU64(0), IU64(0)))); + EXPECT_TRUE(span.contains(Span(IU64(10), IU64(10)))); // Does not contain points outside - EXPECT_FALSE(span.contains(Span(I65(-11), I65(-11)))); - EXPECT_FALSE(span.contains(Span(I65(11), I65(11)))); - EXPECT_FALSE(span.contains(Span(I65(-15), I65(5)))); - EXPECT_FALSE(span.contains(Span(I65(-5), I65(15)))); + EXPECT_FALSE(span.contains(Span(IU64(-11), IU64(-11)))); + EXPECT_FALSE(span.contains(Span(IU64(11), IU64(11)))); + EXPECT_FALSE(span.contains(Span(IU64(-15), IU64(5)))); + EXPECT_FALSE(span.contains(Span(IU64(-5), IU64(15)))); } -TEST(SpanI65Test, NegativeAndPositiveIntersections) { - Span neg{I65(-100), I65(-10)}; - Span pos{I65(10), I65(100)}; +TEST(SpanIU64Test, NegativeAndPositiveIntersections) { + Span neg{IU64(-100), IU64(-10)}; + Span pos{IU64(10), IU64(100)}; EXPECT_FALSE(neg.hasOverlap(pos)); EXPECT_FALSE(pos.hasOverlap(neg)); EXPECT_TRUE(neg.intersection(pos).isEmpty()); EXPECT_TRUE(pos.intersection(neg).isEmpty()); - Span touchNegZero{I65(-10), I65(0)}; - Span touchZeroPos{I65(0), I65(10)}; + Span touchNegZero{IU64(-10), IU64(0)}; + Span touchZeroPos{IU64(0), IU64(10)}; EXPECT_TRUE(touchNegZero.hasOverlap(touchZeroPos)); - EXPECT_EQ(touchNegZero.intersection(touchZeroPos), Span(I65(0), I65(0))); + EXPECT_EQ(touchNegZero.intersection(touchZeroPos), Span(IU64(0), IU64(0))); - Span overlap{I65(-50), I65(50)}; - EXPECT_EQ(neg.intersection(overlap), Span(I65(-50), I65(-10))); - EXPECT_EQ(pos.intersection(overlap), Span(I65(10), I65(50))); + Span overlap{IU64(-50), IU64(50)}; + EXPECT_EQ(neg.intersection(overlap), Span(IU64(-50), IU64(-10))); + EXPECT_EQ(pos.intersection(overlap), Span(IU64(10), IU64(50))); } -TEST(SpanI65Test, SignedUnsignedBoundary) { +TEST(SpanIU64Test, SignedUnsignedBoundary) { // Test around INT64_MAX and 2^63 int64_t maxI64 = std::numeric_limits::max(); uint64_t highBit = uint64_t(maxI64) + 1; // 0x8000000000000000ULL - Span s1(I65(maxI64 - 100), I65(highBit + 50)); - Span s2(I65(highBit), I65(highBit + 100)); + Span s1(IU64(maxI64 - 100), IU64(highBit + 50)); + Span s2(IU64(highBit), IU64(highBit + 100)); EXPECT_TRUE(s1.hasOverlap(s2)); - EXPECT_EQ(s1.intersection(s2), Span(I65(highBit), I65(highBit + 50))); + EXPECT_EQ(s1.intersection(s2), Span(IU64(highBit), IU64(highBit + 50))); // Disjoint near 2^63 boundary - Span s3{I65(maxI64 - 200), I65(maxI64)}; - Span s4{I65(highBit + 1), I65(highBit + 100)}; + Span s3{IU64(maxI64 - 200), IU64(maxI64)}; + Span s4{IU64(highBit + 1), IU64(highBit + 100)}; EXPECT_FALSE(s3.hasOverlap(s4)); EXPECT_TRUE(s3.intersection(s4).isEmpty()); // Adjacent touching at 2^63 - Span s5{I65(maxI64), I65(highBit)}; - Span s6{I65(highBit), I65(highBit + 10)}; + Span s5{IU64(maxI64), IU64(highBit)}; + Span s6{IU64(highBit), IU64(highBit + 10)}; EXPECT_TRUE(s5.hasOverlap(s6)); - EXPECT_EQ(s5.intersection(s6), Span(I65(highBit), I65(highBit))); + EXPECT_EQ(s5.intersection(s6), Span(IU64(highBit), IU64(highBit))); } -TEST(SpanI65Test, ExtremeBoundaries) { - Span minPart(I65(std::numeric_limits::min()), - I65(std::numeric_limits::min() + 100)); - Span maxPart(I65(std::numeric_limits::max() - 100), - I65(std::numeric_limits::max())); +TEST(SpanIU64Test, ExtremeBoundaries) { + Span minPart(IU64(std::numeric_limits::min()), + IU64(std::numeric_limits::min() + 100)); + Span maxPart(IU64(std::numeric_limits::max() - 100), + IU64(std::numeric_limits::max())); EXPECT_FALSE(minPart.hasOverlap(maxPart)); EXPECT_TRUE(minPart.intersection(maxPart).isEmpty()); - Span full = Span::full(); + Span full = Span::full(); EXPECT_TRUE(full.contains(minPart)); EXPECT_TRUE(full.contains(maxPart)); EXPECT_EQ(full.intersection(minPart), minPart); @@ -334,8 +334,8 @@ TEST(SpanI65Test, ExtremeBoundaries) { EXPECT_TRUE(full.hasOverlap(minPart)); EXPECT_TRUE(full.hasOverlap(maxPart)); - Span allNeg(I65(std::numeric_limits::min()), I65(-1)); - Span allNonNeg(I65(0), I65(std::numeric_limits::max())); + Span allNeg(IU64(std::numeric_limits::min()), IU64(-1)); + Span allNonNeg(IU64(0), IU64(std::numeric_limits::max())); EXPECT_FALSE(allNeg.hasOverlap(allNonNeg)); EXPECT_TRUE(allNeg.intersection(allNonNeg).isEmpty()); @@ -343,15 +343,15 @@ TEST(SpanI65Test, ExtremeBoundaries) { EXPECT_TRUE(full.contains(allNonNeg)); } -TEST(SpanI65Test, SetAndMutate) { - Span s; +TEST(SpanIU64Test, SetAndMutate) { + Span s; EXPECT_TRUE(s.isFull()); - s.set(I65(-12345)); + s.set(IU64(-12345)); EXPECT_FALSE(s.isFull()); EXPECT_FALSE(s.isEmpty()); - EXPECT_EQ(s.min, I65(-12345)); - EXPECT_EQ(s.max, I65(-12345)); + EXPECT_EQ(s.min, IU64(-12345)); + EXPECT_EQ(s.max, IU64(-12345)); s.setEmpty(); EXPECT_TRUE(s.isEmpty()); From c317fb8d2ad25e73bb5f5b8e45e1a4b6dd1cc75d Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 11:05:18 -0700 Subject: [PATCH 26/93] format --- src/support/iu64.h | 8 ++++++-- test/gtest/span.cpp | 13 +++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/support/iu64.h b/src/support/iu64.h index a6b0bbb980a..b91666560c8 100644 --- a/src/support/iu64.h +++ b/src/support/iu64.h @@ -93,8 +93,12 @@ struct IU64 { constexpr bool operator<=(const IU64& other) const { return *this < other || *this == other; } - constexpr bool operator>(const IU64& other) const { return !(*this <= other); } - constexpr bool operator>=(const IU64& other) const { return !(*this < other); } + constexpr bool operator>(const IU64& other) const { + return !(*this <= other); + } + constexpr bool operator>=(const IU64& other) const { + return !(*this < other); + } }; inline std::ostream& operator<<(std::ostream& os, const IU64& x) { diff --git a/test/gtest/span.cpp b/test/gtest/span.cpp index 72ff18d2704..f05fd80e2ff 100644 --- a/test/gtest/span.cpp +++ b/test/gtest/span.cpp @@ -223,7 +223,7 @@ TEST(SpanIU64Test, Empty) { TEST(SpanIU64Test, SingletonsAtExtremes) { // Min int64 singleton Span minI64{IU64(std::numeric_limits::min()), - IU64(std::numeric_limits::min())}; + IU64(std::numeric_limits::min())}; EXPECT_FALSE(minI64.isEmpty()); EXPECT_FALSE(minI64.isFull()); EXPECT_EQ(minI64.min, IU64(std::numeric_limits::min())); @@ -243,7 +243,7 @@ TEST(SpanIU64Test, SingletonsAtExtremes) { // Max int64 singleton Span maxI64{IU64(std::numeric_limits::max()), - IU64(std::numeric_limits::max())}; + IU64(std::numeric_limits::max())}; EXPECT_FALSE(maxI64.isEmpty()); // 2^63 singleton (above int64_t max, into uint64_t territory) @@ -252,7 +252,7 @@ TEST(SpanIU64Test, SingletonsAtExtremes) { // Max uint64 singleton Span maxU64{IU64(std::numeric_limits::max()), - IU64(std::numeric_limits::max())}; + IU64(std::numeric_limits::max())}; EXPECT_FALSE(maxU64.isEmpty()); } @@ -286,7 +286,8 @@ TEST(SpanIU64Test, NegativeAndPositiveIntersections) { Span touchNegZero{IU64(-10), IU64(0)}; Span touchZeroPos{IU64(0), IU64(10)}; EXPECT_TRUE(touchNegZero.hasOverlap(touchZeroPos)); - EXPECT_EQ(touchNegZero.intersection(touchZeroPos), Span(IU64(0), IU64(0))); + EXPECT_EQ(touchNegZero.intersection(touchZeroPos), + Span(IU64(0), IU64(0))); Span overlap{IU64(-50), IU64(50)}; EXPECT_EQ(neg.intersection(overlap), Span(IU64(-50), IU64(-10))); @@ -319,9 +320,9 @@ TEST(SpanIU64Test, SignedUnsignedBoundary) { TEST(SpanIU64Test, ExtremeBoundaries) { Span minPart(IU64(std::numeric_limits::min()), - IU64(std::numeric_limits::min() + 100)); + IU64(std::numeric_limits::min() + 100)); Span maxPart(IU64(std::numeric_limits::max() - 100), - IU64(std::numeric_limits::max())); + IU64(std::numeric_limits::max())); EXPECT_FALSE(minPart.hasOverlap(maxPart)); EXPECT_TRUE(minPart.intersection(maxPart).isEmpty()); From 8763274b628a40218196260e266d933dcd4b125c Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 11:06:27 -0700 Subject: [PATCH 27/93] builds --- src/support/span.h | 2 -- test/gtest/CMakeLists.txt | 2 +- test/gtest/iu64.cpp | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/support/span.h b/src/support/span.h index 3b8ea83a8f7..dbd301089cd 100644 --- a/src/support/span.h +++ b/src/support/span.h @@ -22,8 +22,6 @@ #include #include -#include "support/i65.h" - namespace wasm { // A span of values. diff --git a/test/gtest/CMakeLists.txt b/test/gtest/CMakeLists.txt index 13b304b5671..925880bd40a 100644 --- a/test/gtest/CMakeLists.txt +++ b/test/gtest/CMakeLists.txt @@ -17,7 +17,7 @@ set(unittest_SOURCES disjoint_sets.cpp graph.cpp int128.cpp - i65.cpp + iu64.cpp leaves.cpp glbs.cpp inplace_vector.cpp diff --git a/test/gtest/iu64.cpp b/test/gtest/iu64.cpp index 0c38fcbe799..1f812e9f8a3 100644 --- a/test/gtest/iu64.cpp +++ b/test/gtest/iu64.cpp @@ -19,7 +19,7 @@ #include #include -#include "support/i65.h" +#include "support/iu64.h" #include "gtest/gtest.h" using namespace wasm; From 0e493293722733d8cd79eeeff2ab888475547d99 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 11:23:32 -0700 Subject: [PATCH 28/93] work --- src/ir/constraint.cpp | 68 +++++++++++++++++++++++++++++++++++++++++++ src/ir/constraint.h | 6 ++++ 2 files changed, 74 insertions(+) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index a1516280deb..9851b46c4d2 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -22,6 +22,74 @@ namespace wasm::constraint { +std::optional> Constraint::makeSpan() const { + auto* c = std::get_if(&term); + if (!c) { + // Not comparing to a constant, so cannot be a constant span. + return {}; + } + + switch (op) { + case Eq: { + auto x = c->getUnsigned(); + if (x <= std::numeric_limits::max()) { + // This is in the range of both signed and unsigned values, so there is + // no ambiguity. That is, we cannot convert the bit pattern + // 0xffffffffffffffff into a Span, as it might be either uint64_t(-1) + // or actually negative (but a bit pattern like 0x0000000000000001 is + // always fine as it can only ever be "1"). + return Span{x, x}; + } + break; + } + + case LtS: + if (c->getInteger() == std::numeric_limits::min()) { + // Less than the lowest possible number is an empty span. + return Span::empty(); + } else { + return Span{std::numeric_limits::min(), c->getInteger() - 1}; + } + break; + case LtU: + if (c->getInteger() == 0) { + // Less than the lowest possible number is an empty span. + return Span::empty(); + } else { + return Span{0, c->getUnsigned() - 1}; + } + break; + case LeS: + return Span{std::numeric_limits::min(), c->getInteger()}; + case LeU: + return Span{0, c->getUnsigned()}; + + case GtS: + if (c->getInteger() == std::numeric_limits::max()) { + // Greater than the highest possible number is an empty span. + return Span::empty(); + } else { + return Span{c->getInteger() + 1, std::numeric_limits::max}; + } + break; + case GtU: + if (c->getInteger() == 0) { + // Greater than the highest possible number is an empty span. + return Span::empty(); + } else { + return Span{0, c->getUnsigned() - 1}; + } + break; + case GeS: + return Span{std::numeric_limits::min(), c->getInteger()}; + case GeU: + return Span{0, c->getUnsigned()}; + + default: {} + } + + return {}; +} namespace { Result TrueFalse(bool x) { return x ? True : False; } diff --git a/src/ir/constraint.h b/src/ir/constraint.h index c7814effea5..fb37d20633e 100644 --- a/src/ir/constraint.h +++ b/src/ir/constraint.h @@ -27,6 +27,8 @@ #include "ir/abstract.h" #include "support/inplace_vector.h" +#include "support/iu64.h" +#include "support/span.h" #include "support/utilities.h" #include "wasm.h" @@ -63,6 +65,10 @@ struct Constraint { Constraint negate() const { return Constraint{Abstract::negateRelational(op), term}; } + + // Convert the constraint into a constant span, if possible. For example, + // "< 100 (unsigned)" turns into the span [0, 100]. + std::optional> makeSpan() const; }; // We limit constraints to a low number to ensure good performance even with From 4bfa03228de70e08d749824b52b3508a39bb1da7 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 11:25:32 -0700 Subject: [PATCH 29/93] work --- src/ir/constraint.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 9851b46c4d2..331eb15bf77 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -73,23 +73,24 @@ std::optional> Constraint::makeSpan() const { } break; case GtU: - if (c->getInteger() == 0) { + if (c->getInteger() == std::numeric_limits::max()) { // Greater than the highest possible number is an empty span. return Span::empty(); } else { - return Span{0, c->getUnsigned() - 1}; + return Span{c->getUnsigned() + 1, std::numeric_limits::max}; } break; case GeS: - return Span{std::numeric_limits::min(), c->getInteger()}; + return Span{c->getInteger(), std::numeric_limits::max()}; case GeU: - return Span{0, c->getUnsigned()}; + return Span{c->getUnsigned(), std::numeric_limits::max()}; default: {} } return {}; } + namespace { Result TrueFalse(bool x) { return x ? True : False; } From af0bc975e95467bd06899e0b1bf802a7b5c3d895 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 11:25:45 -0700 Subject: [PATCH 30/93] work --- src/ir/constraint.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 331eb15bf77..e456adb4400 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -48,7 +48,8 @@ std::optional> Constraint::makeSpan() const { // Less than the lowest possible number is an empty span. return Span::empty(); } else { - return Span{std::numeric_limits::min(), c->getInteger() - 1}; + return Span{std::numeric_limits::min(), + c->getInteger() - 1}; } break; case LtU: @@ -69,7 +70,8 @@ std::optional> Constraint::makeSpan() const { // Greater than the highest possible number is an empty span. return Span::empty(); } else { - return Span{c->getInteger() + 1, std::numeric_limits::max}; + return Span{c->getInteger() + 1, + std::numeric_limits::max}; } break; case GtU: @@ -77,7 +79,8 @@ std::optional> Constraint::makeSpan() const { // Greater than the highest possible number is an empty span. return Span::empty(); } else { - return Span{c->getUnsigned() + 1, std::numeric_limits::max}; + return Span{c->getUnsigned() + 1, + std::numeric_limits::max}; } break; case GeS: @@ -85,7 +88,8 @@ std::optional> Constraint::makeSpan() const { case GeU: return Span{c->getUnsigned(), std::numeric_limits::max()}; - default: {} + default: { + } } return {}; From 32cc04b0f77774d3c2b563d1e88e4cecfb4fd4ef Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 11:32:05 -0700 Subject: [PATCH 31/93] work --- src/ir/constraint.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index e456adb4400..0208c7f09b6 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -151,6 +151,22 @@ Result provesConstantPair(Abstract::Op aOp, } } + // If we can represent both as spans, we can calculate that way. + if (auto aSpan = Constraint{aOp, aConstant}.getSpan()) { + if (auto bSpan = Constraint{bOp, bConstant}.getSpan()) { + if (bSpan->contains(*aSpan)) { + // b's values contains a's, e.g., b = { 0 < x < 10 } and + // a = { 3 < x < 7 }, so a => b. + return True; + } + if (!bSpan->hasOverlap(*aSpan)) { + // There is no overlap at all, e.g., { 0 < x < 10 } vs { 20 < x < 30 }, + // both cannot be true and each proves the other false. + return False; + } + } + } + if (!recursing) { // The flipped operation may tell us something: y ==> !x implies // x ==> y is false (because if not, then x would prove y, and y would From 3b59e5dc821b5cc50dd2506894dc4add13e7826d Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 11:34:35 -0700 Subject: [PATCH 32/93] work --- src/ir/constraint.cpp | 10 ++++++---- src/ir/constraint.h | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 0208c7f09b6..ee4847de6fd 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -22,7 +22,9 @@ namespace wasm::constraint { -std::optional> Constraint::makeSpan() const { +std::optional> Constraint::getSpan() const { + using namespace Abstract; + auto* c = std::get_if(&term); if (!c) { // Not comparing to a constant, so cannot be a constant span. @@ -71,16 +73,16 @@ std::optional> Constraint::makeSpan() const { return Span::empty(); } else { return Span{c->getInteger() + 1, - std::numeric_limits::max}; + int64_t(std::numeric_limits::max)}; } break; case GtU: - if (c->getInteger() == std::numeric_limits::max()) { + if (c->getUnsigned() == std::numeric_limits::max()) { // Greater than the highest possible number is an empty span. return Span::empty(); } else { return Span{c->getUnsigned() + 1, - std::numeric_limits::max}; + uint64_t(std::numeric_limits::max)}; } break; case GeS: diff --git a/src/ir/constraint.h b/src/ir/constraint.h index fb37d20633e..1bfea0ad8ef 100644 --- a/src/ir/constraint.h +++ b/src/ir/constraint.h @@ -68,7 +68,7 @@ struct Constraint { // Convert the constraint into a constant span, if possible. For example, // "< 100 (unsigned)" turns into the span [0, 100]. - std::optional> makeSpan() const; + std::optional> getSpan() const; }; // We limit constraints to a low number to ensure good performance even with From 69a97dea1dae5cccd7e516afa047404148b83a9b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 11:49:16 -0700 Subject: [PATCH 33/93] testt --- src/ir/constraint.cpp | 4 +- test/gtest/constraint.cpp | 203 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 199 insertions(+), 8 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index ee4847de6fd..c8a2a77aaa5 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -73,7 +73,7 @@ std::optional> Constraint::getSpan() const { return Span::empty(); } else { return Span{c->getInteger() + 1, - int64_t(std::numeric_limits::max)}; + std::numeric_limits::max()}; } break; case GtU: @@ -82,7 +82,7 @@ std::optional> Constraint::getSpan() const { return Span::empty(); } else { return Span{c->getUnsigned() + 1, - uint64_t(std::numeric_limits::max)}; + std::numeric_limits::max()}; } break; case GeS: diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index 36a52220125..ea58167e004 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -1,3 +1,5 @@ +#include + #include "ir/constraint.h" #include "ir/abstract.h" #include "gtest/gtest.h" @@ -275,8 +277,14 @@ TEST(ConstraintTest, TestOrInequality) { auto empty = AndedConstraintSet::makeProvesNothing(); checkOr(eq5, ges7, empty); - // x > 5 || x >= 6 => x > 5 - checkOr(gts5, ges6, gts5); + // x > 5 and x >= 6 are equivalent, so ORing them does not change either. + auto ored1 = gts5; + ored1.approximateOr(ges6); + EXPECT_EQ(ored1, gts5); + + auto ored2 = ges6; + ored2.approximateOr(gts5); + EXPECT_EQ(ored2, ges6); // x > 5 || x >= 5 => x >= 5 checkOr(gts5, ges5, ges5); @@ -294,8 +302,8 @@ TEST(ConstraintTest, TestOrInequality) { // x > signed_max || x >= (signed_max + 1 === signed_min) != x > signed_max AndedConstraintSet gtsMax{ {GtS, {Literal(std::numeric_limits::max())}}}; - // TODO: x > signed_max is always false, so this could return a contradiction - checkOr(gtsMax, gesMin, empty); + // x > signed_max implies x >= signed_min, so ORing them yields x >= signed_min. XXX fix! + checkOr(gtsMax, gesMin, gesMin); } TEST(ConstraintTest, TestOrLoop) { @@ -484,9 +492,16 @@ TEST(ConstraintTest, TestAndLoop) { // inputs). checkAnd(le5, lt5U, AndedConstraintSet{le5[0], lt5U[0]}); - // Different constants do not optimize, but could TODO + // Different constants optimize when one implies the other (x <= 5 and x < 6 + // are equivalent). AndedConstraintSet lt6{{LtS, {Literal(int32_t(6))}}}; - checkAnd(le5, lt6, AndedConstraintSet{le5[0], lt6[0]}); + auto anded1 = le5; + anded1.approximateAnd(lt6[0]); + EXPECT_EQ(anded1, le5); + + auto anded2 = lt6; + anded2.approximateAnd(le5[0]); + EXPECT_EQ(anded2, lt6); // A non-constant. // x <= y && x < y => x < y @@ -660,3 +675,179 @@ TEST(ConstraintTest, TestEqConstraints) { // having $1 > $0 and needing to look $0 up. check(map.get(1), {GtS, {Literal(int32_t(42))}}); } + +TEST(ConstraintTest, GetSpan) { + const IU64 minI64(std::numeric_limits::min()); + const IU64 maxI64(std::numeric_limits::max()); + const IU64 maxU64(std::numeric_limits::max()); + + // Non-literal terms have no constant span. + EXPECT_EQ((Constraint{Eq, {Index(0)}}.getSpan()), std::nullopt); + EXPECT_EQ((Constraint{LtS, {Index(1)}}.getSpan()), std::nullopt); + EXPECT_EQ((Constraint{GeU, {Index(2)}}.getSpan()), std::nullopt); + + // Unsupported operations (e.g. Ne) have no constant span. + EXPECT_EQ((Constraint{Ne, {Literal(int32_t(5))}}.getSpan()), std::nullopt); + EXPECT_EQ((Constraint{Ne, {Literal(int32_t(0))}}.getSpan()), std::nullopt); + + // Eq: only non-negative values up to int32_t max have an unambiguous span. + EXPECT_EQ((Constraint{Eq, {Literal(int32_t(0))}}.getSpan()), + (Span{0, 0})); + EXPECT_EQ((Constraint{Eq, {Literal(int32_t(1))}}.getSpan()), + (Span{1, 1})); + EXPECT_EQ((Constraint{Eq, {Literal(int32_t(42))}}.getSpan()), + (Span{42, 42})); + EXPECT_EQ((Constraint{Eq, {Literal(int64_t(42))}}.getSpan()), + (Span{42, 42})); + EXPECT_EQ( + (Constraint{Eq, {Literal(std::numeric_limits::max())}}.getSpan()), + (Span{uint32_t(std::numeric_limits::max()), + uint32_t(std::numeric_limits::max())})); + + // Eq with negative or large values returns nullopt due to signed/unsigned + // ambiguity. + EXPECT_EQ((Constraint{Eq, {Literal(int32_t(-1))}}.getSpan()), std::nullopt); + EXPECT_EQ((Constraint{Eq, {Literal(int32_t(-42))}}.getSpan()), std::nullopt); + EXPECT_EQ( + (Constraint{Eq, {Literal(std::numeric_limits::min())}}.getSpan()), + std::nullopt); + EXPECT_EQ((Constraint{Eq, {Literal(int64_t(-1))}}.getSpan()), std::nullopt); + EXPECT_EQ( + (Constraint{Eq, {Literal(std::numeric_limits::min())}}.getSpan()), + std::nullopt); + EXPECT_EQ( + (Constraint{Eq, {Literal(int64_t(std::numeric_limits::max()) + 1)}} + .getSpan()), + std::nullopt); + EXPECT_EQ( + (Constraint{Eq, {Literal(std::numeric_limits::max())}}.getSpan()), + std::nullopt); + EXPECT_EQ((Constraint{Eq, {Literal(uint32_t(0x80000000u))}}.getSpan()), + std::nullopt); + EXPECT_EQ( + (Constraint{Eq, {Literal(std::numeric_limits::max())}}.getSpan()), + std::nullopt); + + // LtS: [minI64, C - 1] + EXPECT_EQ((Constraint{LtS, {Literal(int32_t(10))}}.getSpan()), + (Span{minI64, IU64(9)})); + EXPECT_EQ((Constraint{LtS, {Literal(int32_t(0))}}.getSpan()), + (Span{minI64, IU64(-1)})); + EXPECT_EQ((Constraint{LtS, {Literal(int32_t(-5))}}.getSpan()), + (Span{minI64, IU64(-6)})); + EXPECT_EQ((Constraint{LtS, {Literal(int64_t(100))}}.getSpan()), + (Span{minI64, IU64(99)})); + EXPECT_EQ( + (Constraint{LtS, {Literal(std::numeric_limits::max())}}.getSpan()), + (Span{minI64, IU64(std::numeric_limits::max() - 1)})); + // LtS min signed: empty span + auto ltsMin = + Constraint{LtS, {Literal(std::numeric_limits::min())}}.getSpan(); + ASSERT_TRUE(ltsMin.has_value()); + EXPECT_TRUE(ltsMin->isEmpty()); + EXPECT_EQ(ltsMin, Span::empty()); + + // LtU: [0, C - 1] + EXPECT_EQ((Constraint{LtU, {Literal(uint32_t(10))}}.getSpan()), + (Span{IU64(0), IU64(9)})); + EXPECT_EQ((Constraint{LtU, {Literal(uint32_t(1))}}.getSpan()), + (Span{IU64(0), IU64(0)})); + EXPECT_EQ((Constraint{LtU, {Literal(uint64_t(100))}}.getSpan()), + (Span{IU64(0), IU64(99)})); + EXPECT_EQ( + (Constraint{LtU, {Literal(std::numeric_limits::max())}}.getSpan()), + (Span{IU64(0), IU64(std::numeric_limits::max() - 1)})); + // LtU 0: empty span + auto ltuZero32 = Constraint{LtU, {Literal(uint32_t(0))}}.getSpan(); + ASSERT_TRUE(ltuZero32.has_value()); + EXPECT_TRUE(ltuZero32->isEmpty()); + EXPECT_EQ(ltuZero32, Span::empty()); + auto ltuZero64 = Constraint{LtU, {Literal(uint64_t(0))}}.getSpan(); + ASSERT_TRUE(ltuZero64.has_value()); + EXPECT_TRUE(ltuZero64->isEmpty()); + EXPECT_EQ(ltuZero64, Span::empty()); + + // LeS: [minI64, C] + EXPECT_EQ((Constraint{LeS, {Literal(int32_t(10))}}.getSpan()), + (Span{minI64, IU64(10)})); + EXPECT_EQ((Constraint{LeS, {Literal(int32_t(0))}}.getSpan()), + (Span{minI64, IU64(0)})); + EXPECT_EQ((Constraint{LeS, {Literal(int32_t(-5))}}.getSpan()), + (Span{minI64, IU64(-5)})); + EXPECT_EQ( + (Constraint{LeS, {Literal(std::numeric_limits::min())}}.getSpan()), + (Span{minI64, minI64})); + EXPECT_EQ( + (Constraint{LeS, {Literal(std::numeric_limits::max())}}.getSpan()), + (Span{minI64, maxI64})); + + // LeU: [0, C] + EXPECT_EQ((Constraint{LeU, {Literal(uint32_t(0))}}.getSpan()), + (Span{IU64(0), IU64(0)})); + EXPECT_EQ((Constraint{LeU, {Literal(uint32_t(10))}}.getSpan()), + (Span{IU64(0), IU64(10)})); + EXPECT_EQ( + (Constraint{LeU, {Literal(std::numeric_limits::max())}}.getSpan()), + (Span{IU64(0), maxU64})); + + // GtS: [C + 1, maxI64] + EXPECT_EQ((Constraint{GtS, {Literal(int32_t(10))}}.getSpan()), + (Span{IU64(11), maxI64})); + EXPECT_EQ((Constraint{GtS, {Literal(int32_t(0))}}.getSpan()), + (Span{IU64(1), maxI64})); + EXPECT_EQ((Constraint{GtS, {Literal(int32_t(-5))}}.getSpan()), + (Span{IU64(-4), maxI64})); + EXPECT_EQ( + (Constraint{GtS, {Literal(std::numeric_limits::min())}}.getSpan()), + (Span{IU64(std::numeric_limits::min() + 1), maxI64})); + EXPECT_EQ( + (Constraint{GtS, {Literal(std::numeric_limits::max() - 1)}} + .getSpan()), + (Span{maxI64, maxI64})); + // GtS max signed: empty span + auto gtsMax = + Constraint{GtS, {Literal(std::numeric_limits::max())}}.getSpan(); + ASSERT_TRUE(gtsMax.has_value()); + EXPECT_TRUE(gtsMax->isEmpty()); + EXPECT_EQ(gtsMax, Span::empty()); + + // GtU: [C + 1, maxU64] + EXPECT_EQ((Constraint{GtU, {Literal(uint32_t(0))}}.getSpan()), + (Span{IU64(1), maxU64})); + EXPECT_EQ((Constraint{GtU, {Literal(uint32_t(10))}}.getSpan()), + (Span{IU64(11), maxU64})); + EXPECT_EQ( + (Constraint{GtU, {Literal(std::numeric_limits::max() - 1)}} + .getSpan()), + (Span{maxU64, maxU64})); + // GtU max unsigned: empty span + auto gtuMax = + Constraint{GtU, {Literal(std::numeric_limits::max())}}.getSpan(); + ASSERT_TRUE(gtuMax.has_value()); + EXPECT_TRUE(gtuMax->isEmpty()); + EXPECT_EQ(gtuMax, Span::empty()); + + // GeS: [C, maxI64] + EXPECT_EQ((Constraint{GeS, {Literal(int32_t(10))}}.getSpan()), + (Span{IU64(10), maxI64})); + EXPECT_EQ((Constraint{GeS, {Literal(int32_t(0))}}.getSpan()), + (Span{IU64(0), maxI64})); + EXPECT_EQ((Constraint{GeS, {Literal(int32_t(-5))}}.getSpan()), + (Span{IU64(-5), maxI64})); + EXPECT_EQ( + (Constraint{GeS, {Literal(std::numeric_limits::min())}}.getSpan()), + (Span{minI64, maxI64})); + EXPECT_EQ( + (Constraint{GeS, {Literal(std::numeric_limits::max())}}.getSpan()), + (Span{maxI64, maxI64})); + + // GeU: [C, maxU64] + EXPECT_EQ((Constraint{GeU, {Literal(uint32_t(0))}}.getSpan()), + (Span{IU64(0), maxU64})); + EXPECT_EQ((Constraint{GeU, {Literal(uint32_t(10))}}.getSpan()), + (Span{IU64(10), maxU64})); + EXPECT_EQ( + (Constraint{GeU, {Literal(std::numeric_limits::max())}}.getSpan()), + (Span{maxU64, maxU64})); +} + From 424c1ab7b27d727aaf53d0fc4bf6a2001199534c Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 11:57:32 -0700 Subject: [PATCH 34/93] work --- test/gtest/constraint.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index ea58167e004..744f76b3ac7 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -302,7 +302,6 @@ TEST(ConstraintTest, TestOrInequality) { // x > signed_max || x >= (signed_max + 1 === signed_min) != x > signed_max AndedConstraintSet gtsMax{ {GtS, {Literal(std::numeric_limits::max())}}}; - // x > signed_max implies x >= signed_min, so ORing them yields x >= signed_min. XXX fix! checkOr(gtsMax, gesMin, gesMin); } From c05fba8a1f42bad02d3aa2647c5b4ee69d97e144 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 12:01:00 -0700 Subject: [PATCH 35/93] changes --- src/ir/constraint.cpp | 37 +++++++++++++++++++++++++------------ test/gtest/constraint.cpp | 2 +- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index c8a2a77aaa5..48821b465f1 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -31,14 +31,18 @@ std::optional> Constraint::getSpan() const { return {}; } + auto minSigned = c->type == Type::i32 ? std::numeric_limits::min() : std::numeric_limits::min(); + auto maxSigned = c->type == Type::i32 ? std::numeric_limits::max() : std::numeric_limits::max(); + auto maxUnsigned = c->type == Type::i32 ? std::numeric_limits::max() : std::numeric_limits::max(); + switch (op) { case Eq: { auto x = c->getUnsigned(); - if (x <= std::numeric_limits::max()) { + if (x <= uint64_(maxSigned)) { // This is in the range of both signed and unsigned values, so there is // no ambiguity. That is, we cannot convert the bit pattern - // 0xffffffffffffffff into a Span, as it might be either uint64_t(-1) - // or actually negative (but a bit pattern like 0x0000000000000001 is + // 0xffffffff into a Span, as it might be either uint32_t(-1) + // or actually negative (but a bit pattern like 0x00000001 is // always fine as it can only ever be "1"). return Span{x, x}; } @@ -46,11 +50,11 @@ std::optional> Constraint::getSpan() const { } case LtS: - if (c->getInteger() == std::numeric_limits::min()) { + if (c->getInteger() == minSigned) { // Less than the lowest possible number is an empty span. return Span::empty(); } else { - return Span{std::numeric_limits::min(), + return Span{minSigned, c->getInteger() - 1}; } break; @@ -63,32 +67,32 @@ std::optional> Constraint::getSpan() const { } break; case LeS: - return Span{std::numeric_limits::min(), c->getInteger()}; + return Span{minSigned, c->getInteger()}; case LeU: return Span{0, c->getUnsigned()}; case GtS: - if (c->getInteger() == std::numeric_limits::max()) { + if (c->getInteger() == maxSigned) { // Greater than the highest possible number is an empty span. return Span::empty(); } else { return Span{c->getInteger() + 1, - std::numeric_limits::max()}; + maxSigned}; } break; case GtU: - if (c->getUnsigned() == std::numeric_limits::max()) { + if (c->getUnsigned() == maxUnsigned) { // Greater than the highest possible number is an empty span. return Span::empty(); } else { return Span{c->getUnsigned() + 1, - std::numeric_limits::max()}; + maxUnsigned}; } break; case GeS: - return Span{c->getInteger(), std::numeric_limits::max()}; + return Span{c->getInteger(), maxSigned}; case GeU: - return Span{c->getUnsigned(), std::numeric_limits::max()}; + return Span{c->getUnsigned(), maxUnsigned}; default: { } @@ -156,6 +160,15 @@ Result provesConstantPair(Abstract::Op aOp, // If we can represent both as spans, we can calculate that way. if (auto aSpan = Constraint{aOp, aConstant}.getSpan()) { if (auto bSpan = Constraint{bOp, bConstant}.getSpan()) { + if (aSpan->isEmpty()) { + // An empty span implies a contradiction (e.g. x > MAX_INT), as it means + // no possible number can apply. And contradictions prove anything. + return True; + } + if (bSpan->isEmpty()) { + // Nothing that is not a contradiction can prove a contradiction. + return False; + } if (bSpan->contains(*aSpan)) { // b's values contains a's, e.g., b = { 0 < x < 10 } and // a = { 3 < x < 7 }, so a => b. diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index 744f76b3ac7..bb6d8e357a8 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -302,7 +302,7 @@ TEST(ConstraintTest, TestOrInequality) { // x > signed_max || x >= (signed_max + 1 === signed_min) != x > signed_max AndedConstraintSet gtsMax{ {GtS, {Literal(std::numeric_limits::max())}}}; - checkOr(gtsMax, gesMin, gesMin); + checkOr(gtsMax, gesMin, gesMin); // TODO: x > signed_max is a contradiction } TEST(ConstraintTest, TestOrLoop) { From b5ea854b97e6af5cd35e69076eae686129b351b1 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 14:29:15 -0700 Subject: [PATCH 36/93] work --- src/ir/constraint.cpp | 2 +- test/gtest/constraint.cpp | 275 ++++++++++++++++++++++++++++++-------- 2 files changed, 223 insertions(+), 54 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 48821b465f1..1cf03da7d11 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -38,7 +38,7 @@ std::optional> Constraint::getSpan() const { switch (op) { case Eq: { auto x = c->getUnsigned(); - if (x <= uint64_(maxSigned)) { + if (x <= uint64_t(maxSigned)) { // This is in the range of both signed and unsigned values, so there is // no ambiguity. That is, we cannot convert the bit pattern // 0xffffffff into a Span, as it might be either uint32_t(-1) diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index bb6d8e357a8..4b0dd84b113 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -676,6 +676,9 @@ TEST(ConstraintTest, TestEqConstraints) { } TEST(ConstraintTest, GetSpan) { + const IU64 minI32(std::numeric_limits::min()); + const IU64 maxI32(std::numeric_limits::max()); + const IU64 maxU32(std::numeric_limits::max()); const IU64 minI64(std::numeric_limits::min()); const IU64 maxI64(std::numeric_limits::max()); const IU64 maxU64(std::numeric_limits::max()); @@ -689,90 +692,130 @@ TEST(ConstraintTest, GetSpan) { EXPECT_EQ((Constraint{Ne, {Literal(int32_t(5))}}.getSpan()), std::nullopt); EXPECT_EQ((Constraint{Ne, {Literal(int32_t(0))}}.getSpan()), std::nullopt); - // Eq: only non-negative values up to int32_t max have an unambiguous span. + // Eq (i32): non-negative values up to int32_t max have an unambiguous span. EXPECT_EQ((Constraint{Eq, {Literal(int32_t(0))}}.getSpan()), (Span{0, 0})); EXPECT_EQ((Constraint{Eq, {Literal(int32_t(1))}}.getSpan()), (Span{1, 1})); EXPECT_EQ((Constraint{Eq, {Literal(int32_t(42))}}.getSpan()), (Span{42, 42})); - EXPECT_EQ((Constraint{Eq, {Literal(int64_t(42))}}.getSpan()), - (Span{42, 42})); EXPECT_EQ( (Constraint{Eq, {Literal(std::numeric_limits::max())}}.getSpan()), - (Span{uint32_t(std::numeric_limits::max()), - uint32_t(std::numeric_limits::max())})); + (Span{maxI32, maxI32})); - // Eq with negative or large values returns nullopt due to signed/unsigned - // ambiguity. + // Eq (i32) with negative or large unsigned values returns nullopt due to + // signed/unsigned ambiguity. EXPECT_EQ((Constraint{Eq, {Literal(int32_t(-1))}}.getSpan()), std::nullopt); EXPECT_EQ((Constraint{Eq, {Literal(int32_t(-42))}}.getSpan()), std::nullopt); EXPECT_EQ( (Constraint{Eq, {Literal(std::numeric_limits::min())}}.getSpan()), std::nullopt); - EXPECT_EQ((Constraint{Eq, {Literal(int64_t(-1))}}.getSpan()), std::nullopt); + EXPECT_EQ((Constraint{Eq, {Literal(uint32_t(0x80000000u))}}.getSpan()), + std::nullopt); EXPECT_EQ( - (Constraint{Eq, {Literal(std::numeric_limits::min())}}.getSpan()), + (Constraint{Eq, {Literal(std::numeric_limits::max())}}.getSpan()), std::nullopt); + + // Eq (i64): non-negative values up to int64_t max have an unambiguous span. + EXPECT_EQ((Constraint{Eq, {Literal(int64_t(0))}}.getSpan()), + (Span{0, 0})); + EXPECT_EQ((Constraint{Eq, {Literal(int64_t(42))}}.getSpan()), + (Span{42, 42})); EXPECT_EQ( (Constraint{Eq, {Literal(int64_t(std::numeric_limits::max()) + 1)}} .getSpan()), - std::nullopt); + (Span{uint64_t(std::numeric_limits::max()) + 1, + uint64_t(std::numeric_limits::max()) + 1})); EXPECT_EQ( (Constraint{Eq, {Literal(std::numeric_limits::max())}}.getSpan()), + (Span{maxI64, maxI64})); + + // Eq (i64) with negative or large unsigned values returns nullopt. + EXPECT_EQ((Constraint{Eq, {Literal(int64_t(-1))}}.getSpan()), std::nullopt); + EXPECT_EQ( + (Constraint{Eq, {Literal(std::numeric_limits::min())}}.getSpan()), std::nullopt); - EXPECT_EQ((Constraint{Eq, {Literal(uint32_t(0x80000000u))}}.getSpan()), + EXPECT_EQ((Constraint{Eq, {Literal(uint64_t(uint64_t(1) << 63))}}.getSpan()), std::nullopt); EXPECT_EQ( (Constraint{Eq, {Literal(std::numeric_limits::max())}}.getSpan()), std::nullopt); - // LtS: [minI64, C - 1] + // LtS (i32): [minI32, C - 1] EXPECT_EQ((Constraint{LtS, {Literal(int32_t(10))}}.getSpan()), - (Span{minI64, IU64(9)})); + (Span{minI32, IU64(9)})); EXPECT_EQ((Constraint{LtS, {Literal(int32_t(0))}}.getSpan()), - (Span{minI64, IU64(-1)})); + (Span{minI32, IU64(-1)})); EXPECT_EQ((Constraint{LtS, {Literal(int32_t(-5))}}.getSpan()), - (Span{minI64, IU64(-6)})); + (Span{minI32, IU64(-6)})); + EXPECT_EQ( + (Constraint{LtS, {Literal(std::numeric_limits::max())}}.getSpan()), + (Span{minI32, IU64(std::numeric_limits::max() - 1)})); + // LtS min signed (i32): empty span + auto ltsMin32 = + Constraint{LtS, {Literal(std::numeric_limits::min())}}.getSpan(); + ASSERT_TRUE(ltsMin32.has_value()); + EXPECT_TRUE(ltsMin32->isEmpty()); + EXPECT_EQ(ltsMin32, Span::empty()); + + // LtS (i64): [minI64, C - 1] EXPECT_EQ((Constraint{LtS, {Literal(int64_t(100))}}.getSpan()), (Span{minI64, IU64(99)})); + EXPECT_EQ((Constraint{LtS, {Literal(int64_t(0))}}.getSpan()), + (Span{minI64, IU64(-1)})); EXPECT_EQ( (Constraint{LtS, {Literal(std::numeric_limits::max())}}.getSpan()), (Span{minI64, IU64(std::numeric_limits::max() - 1)})); - // LtS min signed: empty span - auto ltsMin = + // LtS min signed (i64): empty span + auto ltsMin64 = Constraint{LtS, {Literal(std::numeric_limits::min())}}.getSpan(); - ASSERT_TRUE(ltsMin.has_value()); - EXPECT_TRUE(ltsMin->isEmpty()); - EXPECT_EQ(ltsMin, Span::empty()); + ASSERT_TRUE(ltsMin64.has_value()); + EXPECT_TRUE(ltsMin64->isEmpty()); + EXPECT_EQ(ltsMin64, Span::empty()); - // LtU: [0, C - 1] + // LtU (i32): [0, C - 1] EXPECT_EQ((Constraint{LtU, {Literal(uint32_t(10))}}.getSpan()), (Span{IU64(0), IU64(9)})); EXPECT_EQ((Constraint{LtU, {Literal(uint32_t(1))}}.getSpan()), (Span{IU64(0), IU64(0)})); - EXPECT_EQ((Constraint{LtU, {Literal(uint64_t(100))}}.getSpan()), - (Span{IU64(0), IU64(99)})); EXPECT_EQ( - (Constraint{LtU, {Literal(std::numeric_limits::max())}}.getSpan()), - (Span{IU64(0), IU64(std::numeric_limits::max() - 1)})); - // LtU 0: empty span + (Constraint{LtU, {Literal(std::numeric_limits::max())}}.getSpan()), + (Span{IU64(0), IU64(uint64_t(std::numeric_limits::max()) - 1)})); + // LtU 0 (i32): empty span auto ltuZero32 = Constraint{LtU, {Literal(uint32_t(0))}}.getSpan(); ASSERT_TRUE(ltuZero32.has_value()); EXPECT_TRUE(ltuZero32->isEmpty()); EXPECT_EQ(ltuZero32, Span::empty()); + + // LtU (i64): [0, C - 1] + EXPECT_EQ((Constraint{LtU, {Literal(uint64_t(100))}}.getSpan()), + (Span{IU64(0), IU64(99)})); + EXPECT_EQ( + (Constraint{LtU, {Literal(std::numeric_limits::max())}}.getSpan()), + (Span{IU64(0), IU64(std::numeric_limits::max() - 1)})); + // LtU 0 (i64): empty span auto ltuZero64 = Constraint{LtU, {Literal(uint64_t(0))}}.getSpan(); ASSERT_TRUE(ltuZero64.has_value()); EXPECT_TRUE(ltuZero64->isEmpty()); EXPECT_EQ(ltuZero64, Span::empty()); - // LeS: [minI64, C] + // LeS (i32): [minI32, C] EXPECT_EQ((Constraint{LeS, {Literal(int32_t(10))}}.getSpan()), - (Span{minI64, IU64(10)})); + (Span{minI32, IU64(10)})); EXPECT_EQ((Constraint{LeS, {Literal(int32_t(0))}}.getSpan()), - (Span{minI64, IU64(0)})); + (Span{minI32, IU64(0)})); EXPECT_EQ((Constraint{LeS, {Literal(int32_t(-5))}}.getSpan()), - (Span{minI64, IU64(-5)})); + (Span{minI32, IU64(-5)})); + EXPECT_EQ( + (Constraint{LeS, {Literal(std::numeric_limits::min())}}.getSpan()), + (Span{minI32, minI32})); + EXPECT_EQ( + (Constraint{LeS, {Literal(std::numeric_limits::max())}}.getSpan()), + (Span{minI32, maxI32})); + + // LeS (i64): [minI64, C] + EXPECT_EQ((Constraint{LeS, {Literal(int64_t(10))}}.getSpan()), + (Span{minI64, IU64(10)})); EXPECT_EQ( (Constraint{LeS, {Literal(std::numeric_limits::min())}}.getSpan()), (Span{minI64, minI64})); @@ -780,22 +823,50 @@ TEST(ConstraintTest, GetSpan) { (Constraint{LeS, {Literal(std::numeric_limits::max())}}.getSpan()), (Span{minI64, maxI64})); - // LeU: [0, C] + // LeU (i32): [0, C] EXPECT_EQ((Constraint{LeU, {Literal(uint32_t(0))}}.getSpan()), (Span{IU64(0), IU64(0)})); EXPECT_EQ((Constraint{LeU, {Literal(uint32_t(10))}}.getSpan()), (Span{IU64(0), IU64(10)})); + EXPECT_EQ( + (Constraint{LeU, {Literal(std::numeric_limits::max())}}.getSpan()), + (Span{IU64(0), maxU32})); + + // LeU (i64): [0, C] + EXPECT_EQ((Constraint{LeU, {Literal(uint64_t(0))}}.getSpan()), + (Span{IU64(0), IU64(0)})); + EXPECT_EQ((Constraint{LeU, {Literal(uint64_t(10))}}.getSpan()), + (Span{IU64(0), IU64(10)})); EXPECT_EQ( (Constraint{LeU, {Literal(std::numeric_limits::max())}}.getSpan()), (Span{IU64(0), maxU64})); - // GtS: [C + 1, maxI64] + // GtS (i32): [C + 1, maxI32] EXPECT_EQ((Constraint{GtS, {Literal(int32_t(10))}}.getSpan()), - (Span{IU64(11), maxI64})); + (Span{IU64(11), maxI32})); EXPECT_EQ((Constraint{GtS, {Literal(int32_t(0))}}.getSpan()), - (Span{IU64(1), maxI64})); + (Span{IU64(1), maxI32})); EXPECT_EQ((Constraint{GtS, {Literal(int32_t(-5))}}.getSpan()), - (Span{IU64(-4), maxI64})); + (Span{IU64(-4), maxI32})); + EXPECT_EQ( + (Constraint{GtS, {Literal(std::numeric_limits::min())}}.getSpan()), + (Span{IU64(std::numeric_limits::min() + 1), maxI32})); + EXPECT_EQ( + (Constraint{GtS, {Literal(std::numeric_limits::max() - 1)}} + .getSpan()), + (Span{maxI32, maxI32})); + // GtS max signed (i32): empty span + auto gtsMax32 = + Constraint{GtS, {Literal(std::numeric_limits::max())}}.getSpan(); + ASSERT_TRUE(gtsMax32.has_value()); + EXPECT_TRUE(gtsMax32->isEmpty()); + EXPECT_EQ(gtsMax32, Span::empty()); + + // GtS (i64): [C + 1, maxI64] + EXPECT_EQ((Constraint{GtS, {Literal(int64_t(10))}}.getSpan()), + (Span{IU64(11), maxI64})); + EXPECT_EQ((Constraint{GtS, {Literal(int64_t(0))}}.getSpan()), + (Span{IU64(1), maxI64})); EXPECT_EQ( (Constraint{GtS, {Literal(std::numeric_limits::min())}}.getSpan()), (Span{IU64(std::numeric_limits::min() + 1), maxI64})); @@ -803,36 +874,64 @@ TEST(ConstraintTest, GetSpan) { (Constraint{GtS, {Literal(std::numeric_limits::max() - 1)}} .getSpan()), (Span{maxI64, maxI64})); - // GtS max signed: empty span - auto gtsMax = + // GtS max signed (i64): empty span + auto gtsMax64 = Constraint{GtS, {Literal(std::numeric_limits::max())}}.getSpan(); - ASSERT_TRUE(gtsMax.has_value()); - EXPECT_TRUE(gtsMax->isEmpty()); - EXPECT_EQ(gtsMax, Span::empty()); + ASSERT_TRUE(gtsMax64.has_value()); + EXPECT_TRUE(gtsMax64->isEmpty()); + EXPECT_EQ(gtsMax64, Span::empty()); - // GtU: [C + 1, maxU64] + // GtU (i32): [C + 1, maxU32] EXPECT_EQ((Constraint{GtU, {Literal(uint32_t(0))}}.getSpan()), - (Span{IU64(1), maxU64})); + (Span{IU64(1), maxU32})); EXPECT_EQ((Constraint{GtU, {Literal(uint32_t(10))}}.getSpan()), + (Span{IU64(11), maxU32})); + EXPECT_EQ( + (Constraint{GtU, {Literal(std::numeric_limits::max() - 1)}} + .getSpan()), + (Span{maxU32, maxU32})); + // GtU max unsigned (i32): empty span + auto gtuMax32 = + Constraint{GtU, {Literal(std::numeric_limits::max())}}.getSpan(); + ASSERT_TRUE(gtuMax32.has_value()); + EXPECT_TRUE(gtuMax32->isEmpty()); + EXPECT_EQ(gtuMax32, Span::empty()); + + // GtU (i64): [C + 1, maxU64] + EXPECT_EQ((Constraint{GtU, {Literal(uint64_t(0))}}.getSpan()), + (Span{IU64(1), maxU64})); + EXPECT_EQ((Constraint{GtU, {Literal(uint64_t(10))}}.getSpan()), (Span{IU64(11), maxU64})); EXPECT_EQ( (Constraint{GtU, {Literal(std::numeric_limits::max() - 1)}} .getSpan()), (Span{maxU64, maxU64})); - // GtU max unsigned: empty span - auto gtuMax = + // GtU max unsigned (i64): empty span + auto gtuMax64 = Constraint{GtU, {Literal(std::numeric_limits::max())}}.getSpan(); - ASSERT_TRUE(gtuMax.has_value()); - EXPECT_TRUE(gtuMax->isEmpty()); - EXPECT_EQ(gtuMax, Span::empty()); + ASSERT_TRUE(gtuMax64.has_value()); + EXPECT_TRUE(gtuMax64->isEmpty()); + EXPECT_EQ(gtuMax64, Span::empty()); - // GeS: [C, maxI64] + // GeS (i32): [C, maxI32] EXPECT_EQ((Constraint{GeS, {Literal(int32_t(10))}}.getSpan()), - (Span{IU64(10), maxI64})); + (Span{IU64(10), maxI32})); EXPECT_EQ((Constraint{GeS, {Literal(int32_t(0))}}.getSpan()), - (Span{IU64(0), maxI64})); + (Span{IU64(0), maxI32})); EXPECT_EQ((Constraint{GeS, {Literal(int32_t(-5))}}.getSpan()), - (Span{IU64(-5), maxI64})); + (Span{IU64(-5), maxI32})); + EXPECT_EQ( + (Constraint{GeS, {Literal(std::numeric_limits::min())}}.getSpan()), + (Span{minI32, maxI32})); + EXPECT_EQ( + (Constraint{GeS, {Literal(std::numeric_limits::max())}}.getSpan()), + (Span{maxI32, maxI32})); + + // GeS (i64): [C, maxI64] + EXPECT_EQ((Constraint{GeS, {Literal(int64_t(10))}}.getSpan()), + (Span{IU64(10), maxI64})); + EXPECT_EQ((Constraint{GeS, {Literal(int64_t(0))}}.getSpan()), + (Span{IU64(0), maxI64})); EXPECT_EQ( (Constraint{GeS, {Literal(std::numeric_limits::min())}}.getSpan()), (Span{minI64, maxI64})); @@ -840,13 +939,83 @@ TEST(ConstraintTest, GetSpan) { (Constraint{GeS, {Literal(std::numeric_limits::max())}}.getSpan()), (Span{maxI64, maxI64})); - // GeU: [C, maxU64] + // GeU (i32): [C, maxU32] EXPECT_EQ((Constraint{GeU, {Literal(uint32_t(0))}}.getSpan()), - (Span{IU64(0), maxU64})); + (Span{IU64(0), maxU32})); EXPECT_EQ((Constraint{GeU, {Literal(uint32_t(10))}}.getSpan()), + (Span{IU64(10), maxU32})); + EXPECT_EQ( + (Constraint{GeU, {Literal(std::numeric_limits::max())}}.getSpan()), + (Span{maxU32, maxU32})); + + // GeU (i64): [C, maxU64] + EXPECT_EQ((Constraint{GeU, {Literal(uint64_t(0))}}.getSpan()), + (Span{IU64(0), maxU64})); + EXPECT_EQ((Constraint{GeU, {Literal(uint64_t(10))}}.getSpan()), (Span{IU64(10), maxU64})); EXPECT_EQ( (Constraint{GeU, {Literal(std::numeric_limits::max())}}.getSpan()), (Span{maxU64, maxU64})); } +TEST(ConstraintTest, EmptySpanContradiction) { + // Impossible constraints produce empty spans. + Constraint gtsMax32{GtS, {Literal(std::numeric_limits::max())}}; + Constraint ltsMin32{LtS, {Literal(std::numeric_limits::min())}}; + Constraint ltuZero32{LtU, {Literal(uint32_t(0))}}; + Constraint gtuMax32{GtU, {Literal(std::numeric_limits::max())}}; + + Constraint gtsMax64{GtS, {Literal(std::numeric_limits::max())}}; + Constraint ltsMin64{LtS, {Literal(std::numeric_limits::min())}}; + Constraint ltuZero64{LtU, {Literal(uint64_t(0))}}; + Constraint gtuMax64{GtU, {Literal(std::numeric_limits::max())}}; + + Constraint eq5{Eq, {Literal(int32_t(5))}}; + Constraint ge0{GeS, {Literal(int32_t(0))}}; + Constraint eq100_64{Eq, {Literal(int64_t(100))}}; + + // An impossible constraint proves anything is True. + EXPECT_EQ(AndedConstraintSet{gtsMax32}.proves(eq5), True); + EXPECT_EQ(AndedConstraintSet{ltsMin32}.proves(ge0), True); + EXPECT_EQ(AndedConstraintSet{ltuZero32}.proves(eq5), True); + EXPECT_EQ(AndedConstraintSet{gtuMax32}.proves(ge0), True); + + EXPECT_EQ(AndedConstraintSet{gtsMax64}.proves(eq100_64), True); + EXPECT_EQ(AndedConstraintSet{ltsMin64}.proves(eq100_64), True); + EXPECT_EQ(AndedConstraintSet{ltuZero64}.proves(eq100_64), True); + EXPECT_EQ(AndedConstraintSet{gtuMax64}.proves(eq100_64), True); + + // Impossible constraint proves another impossible constraint is True. + EXPECT_EQ(AndedConstraintSet{gtsMax32}.proves(ltsMin32), True); + EXPECT_EQ(AndedConstraintSet{ltuZero32}.proves(gtuMax32), True); + + // A normal constraint proves an impossible constraint is False. + EXPECT_EQ(AndedConstraintSet{eq5}.proves(gtsMax32), False); + EXPECT_EQ(AndedConstraintSet{eq5}.proves(ltsMin32), False); + EXPECT_EQ(AndedConstraintSet{eq5}.proves(ltuZero32), False); + EXPECT_EQ(AndedConstraintSet{eq5}.proves(gtuMax32), False); + + EXPECT_EQ(AndedConstraintSet{eq100_64}.proves(gtsMax64), False); + EXPECT_EQ(AndedConstraintSet{eq100_64}.proves(ltsMin64), False); + EXPECT_EQ(AndedConstraintSet{eq100_64}.proves(ltuZero64), False); + EXPECT_EQ(AndedConstraintSet{eq100_64}.proves(gtuMax64), False); + + // An impossible constraint in a set proves any condition. + AndedConstraintSet s{gtsMax32}; + EXPECT_EQ(s.proves(eq5), True); + EXPECT_EQ(s.proves(ge0), True); + + // Adding an impossible constraint to a non-empty set proves False and turns + // the set into an explicit contradiction (provesEverything() == true). + AndedConstraintSet s2; + s2.set(eq5); + s2.approximateAnd(ltuZero32); + EXPECT_TRUE(s2.provesEverything()); + + // ORing an impossible constraint (which has no models) with a valid set + // leaves the valid set. + AndedConstraintSet valid{{Eq, {Literal(int32_t(42))}}}; + AndedConstraintSet impossible{gtsMax32}; + checkOr(valid, impossible, valid); +} + From 7048dd2498f06eecb6fb027b025090a8ef216b0b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 14:29:24 -0700 Subject: [PATCH 37/93] work --- src/ir/constraint.cpp | 19 ++++++++-------- test/gtest/constraint.cpp | 48 +++++++++++++++++++-------------------- 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 1cf03da7d11..681d4cb0ee4 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -31,9 +31,13 @@ std::optional> Constraint::getSpan() const { return {}; } - auto minSigned = c->type == Type::i32 ? std::numeric_limits::min() : std::numeric_limits::min(); - auto maxSigned = c->type == Type::i32 ? std::numeric_limits::max() : std::numeric_limits::max(); - auto maxUnsigned = c->type == Type::i32 ? std::numeric_limits::max() : std::numeric_limits::max(); + auto minSigned = c->type == Type::i32 ? std::numeric_limits::min() + : std::numeric_limits::min(); + auto maxSigned = c->type == Type::i32 ? std::numeric_limits::max() + : std::numeric_limits::max(); + auto maxUnsigned = c->type == Type::i32 + ? std::numeric_limits::max() + : std::numeric_limits::max(); switch (op) { case Eq: { @@ -54,8 +58,7 @@ std::optional> Constraint::getSpan() const { // Less than the lowest possible number is an empty span. return Span::empty(); } else { - return Span{minSigned, - c->getInteger() - 1}; + return Span{minSigned, c->getInteger() - 1}; } break; case LtU: @@ -76,8 +79,7 @@ std::optional> Constraint::getSpan() const { // Greater than the highest possible number is an empty span. return Span::empty(); } else { - return Span{c->getInteger() + 1, - maxSigned}; + return Span{c->getInteger() + 1, maxSigned}; } break; case GtU: @@ -85,8 +87,7 @@ std::optional> Constraint::getSpan() const { // Greater than the highest possible number is an empty span. return Span::empty(); } else { - return Span{c->getUnsigned() + 1, - maxUnsigned}; + return Span{c->getUnsigned() + 1, maxUnsigned}; } break; case GeS: diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index 4b0dd84b113..6ba0672d8a7 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -779,8 +779,10 @@ TEST(ConstraintTest, GetSpan) { EXPECT_EQ((Constraint{LtU, {Literal(uint32_t(1))}}.getSpan()), (Span{IU64(0), IU64(0)})); EXPECT_EQ( - (Constraint{LtU, {Literal(std::numeric_limits::max())}}.getSpan()), - (Span{IU64(0), IU64(uint64_t(std::numeric_limits::max()) - 1)})); + (Constraint{LtU, {Literal(std::numeric_limits::max())}} + .getSpan()), + (Span{IU64(0), + IU64(uint64_t(std::numeric_limits::max()) - 1)})); // LtU 0 (i32): empty span auto ltuZero32 = Constraint{LtU, {Literal(uint32_t(0))}}.getSpan(); ASSERT_TRUE(ltuZero32.has_value()); @@ -791,7 +793,8 @@ TEST(ConstraintTest, GetSpan) { EXPECT_EQ((Constraint{LtU, {Literal(uint64_t(100))}}.getSpan()), (Span{IU64(0), IU64(99)})); EXPECT_EQ( - (Constraint{LtU, {Literal(std::numeric_limits::max())}}.getSpan()), + (Constraint{LtU, {Literal(std::numeric_limits::max())}} + .getSpan()), (Span{IU64(0), IU64(std::numeric_limits::max() - 1)})); // LtU 0 (i64): empty span auto ltuZero64 = Constraint{LtU, {Literal(uint64_t(0))}}.getSpan(); @@ -828,18 +831,18 @@ TEST(ConstraintTest, GetSpan) { (Span{IU64(0), IU64(0)})); EXPECT_EQ((Constraint{LeU, {Literal(uint32_t(10))}}.getSpan()), (Span{IU64(0), IU64(10)})); - EXPECT_EQ( - (Constraint{LeU, {Literal(std::numeric_limits::max())}}.getSpan()), - (Span{IU64(0), maxU32})); + EXPECT_EQ((Constraint{LeU, {Literal(std::numeric_limits::max())}} + .getSpan()), + (Span{IU64(0), maxU32})); // LeU (i64): [0, C] EXPECT_EQ((Constraint{LeU, {Literal(uint64_t(0))}}.getSpan()), (Span{IU64(0), IU64(0)})); EXPECT_EQ((Constraint{LeU, {Literal(uint64_t(10))}}.getSpan()), (Span{IU64(0), IU64(10)})); - EXPECT_EQ( - (Constraint{LeU, {Literal(std::numeric_limits::max())}}.getSpan()), - (Span{IU64(0), maxU64})); + EXPECT_EQ((Constraint{LeU, {Literal(std::numeric_limits::max())}} + .getSpan()), + (Span{IU64(0), maxU64})); // GtS (i32): [C + 1, maxI32] EXPECT_EQ((Constraint{GtS, {Literal(int32_t(10))}}.getSpan()), @@ -851,10 +854,9 @@ TEST(ConstraintTest, GetSpan) { EXPECT_EQ( (Constraint{GtS, {Literal(std::numeric_limits::min())}}.getSpan()), (Span{IU64(std::numeric_limits::min() + 1), maxI32})); - EXPECT_EQ( - (Constraint{GtS, {Literal(std::numeric_limits::max() - 1)}} - .getSpan()), - (Span{maxI32, maxI32})); + EXPECT_EQ((Constraint{GtS, {Literal(std::numeric_limits::max() - 1)}} + .getSpan()), + (Span{maxI32, maxI32})); // GtS max signed (i32): empty span auto gtsMax32 = Constraint{GtS, {Literal(std::numeric_limits::max())}}.getSpan(); @@ -870,10 +872,9 @@ TEST(ConstraintTest, GetSpan) { EXPECT_EQ( (Constraint{GtS, {Literal(std::numeric_limits::min())}}.getSpan()), (Span{IU64(std::numeric_limits::min() + 1), maxI64})); - EXPECT_EQ( - (Constraint{GtS, {Literal(std::numeric_limits::max() - 1)}} - .getSpan()), - (Span{maxI64, maxI64})); + EXPECT_EQ((Constraint{GtS, {Literal(std::numeric_limits::max() - 1)}} + .getSpan()), + (Span{maxI64, maxI64})); // GtS max signed (i64): empty span auto gtsMax64 = Constraint{GtS, {Literal(std::numeric_limits::max())}}.getSpan(); @@ -944,18 +945,18 @@ TEST(ConstraintTest, GetSpan) { (Span{IU64(0), maxU32})); EXPECT_EQ((Constraint{GeU, {Literal(uint32_t(10))}}.getSpan()), (Span{IU64(10), maxU32})); - EXPECT_EQ( - (Constraint{GeU, {Literal(std::numeric_limits::max())}}.getSpan()), - (Span{maxU32, maxU32})); + EXPECT_EQ((Constraint{GeU, {Literal(std::numeric_limits::max())}} + .getSpan()), + (Span{maxU32, maxU32})); // GeU (i64): [C, maxU64] EXPECT_EQ((Constraint{GeU, {Literal(uint64_t(0))}}.getSpan()), (Span{IU64(0), maxU64})); EXPECT_EQ((Constraint{GeU, {Literal(uint64_t(10))}}.getSpan()), (Span{IU64(10), maxU64})); - EXPECT_EQ( - (Constraint{GeU, {Literal(std::numeric_limits::max())}}.getSpan()), - (Span{maxU64, maxU64})); + EXPECT_EQ((Constraint{GeU, {Literal(std::numeric_limits::max())}} + .getSpan()), + (Span{maxU64, maxU64})); } TEST(ConstraintTest, EmptySpanContradiction) { @@ -1018,4 +1019,3 @@ TEST(ConstraintTest, EmptySpanContradiction) { AndedConstraintSet impossible{gtsMax32}; checkOr(valid, impossible, valid); } - From 9e42b9d4aae7ff714255aec43056e49a9434e4a9 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 14:32:17 -0700 Subject: [PATCH 38/93] work --- test/gtest/constraint.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index 6ba0672d8a7..2cbd6439bce 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -302,7 +302,8 @@ TEST(ConstraintTest, TestOrInequality) { // x > signed_max || x >= (signed_max + 1 === signed_min) != x > signed_max AndedConstraintSet gtsMax{ {GtS, {Literal(std::numeric_limits::max())}}}; - checkOr(gtsMax, gesMin, gesMin); // TODO: x > signed_max is a contradiction + // x > signed_max is impossible, so it vanishes in the OR. + checkOr(gtsMax, gesMin, gesMin); } TEST(ConstraintTest, TestOrLoop) { From d80eae557a9a35c381069cc3e151f537c1681bfa Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 14:39:20 -0700 Subject: [PATCH 39/93] work --- src/ir/constraint.cpp | 2 +- test/gtest/constraint.cpp | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 681d4cb0ee4..b096194324f 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -167,7 +167,7 @@ Result provesConstantPair(Abstract::Op aOp, return True; } if (bSpan->isEmpty()) { - // Nothing that is not a contradiction can prove a contradiction. + // Anything that is not a contradiction can prove a contradiction. return False; } if (bSpan->contains(*aSpan)) { diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index 2cbd6439bce..4c107087094 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -960,6 +960,13 @@ TEST(ConstraintTest, GetSpan) { (Span{maxU64, maxU64})); } +TEST(ConstraintTest, SpanOptimizations) { + // Using spans, we can optimize things like {x < 100} => {x < 200}. + Constraint lts100{LtS, {Literal(int32_t(100))}}; + Constraint lts200{LtS, {Literal(int32_t(200))}}; + EXPECT_EQ(AndedConstraintSet{lts100}.proves(lts200), True); +} + TEST(ConstraintTest, EmptySpanContradiction) { // Impossible constraints produce empty spans. Constraint gtsMax32{GtS, {Literal(std::numeric_limits::max())}}; From 2960da75eb645b5aeb16d519a399e9381e490cb0 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 14:42:38 -0700 Subject: [PATCH 40/93] work --- test/gtest/constraint.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index 4c107087094..751bd2f7f6d 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -965,6 +965,15 @@ TEST(ConstraintTest, SpanOptimizations) { Constraint lts100{LtS, {Literal(int32_t(100))}}; Constraint lts200{LtS, {Literal(int32_t(200))}}; EXPECT_EQ(AndedConstraintSet{lts100}.proves(lts200), True); + + // Mixing signed and unsigned works fine: x in [0, 100] (x <= 100 unsigned) + // proves x in [-MIN_INT, 200] (x < 200 signed) is true. + Constraint leu100{LtU, {Literal(int32_t(100))}}; + EXPECT_EQ(AndedConstraintSet{leu100}.proves(lts200), True); + + // Replacing 100 with 500, we can no longer prove anything. + Constraint leu500{LtU, {Literal(int32_t(500))}}; + EXPECT_EQ(AndedConstraintSet{leu500}.proves(lts200), Unknown); } TEST(ConstraintTest, EmptySpanContradiction) { From 1443d2605a3952a56703cdc4d0dc80e2fc8352b4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 14:53:41 -0700 Subject: [PATCH 41/93] work --- .../lit/passes/constraint-analysis-loops.wast | 161 ++++++++++++++++-- 1 file changed, 144 insertions(+), 17 deletions(-) diff --git a/test/lit/passes/constraint-analysis-loops.wast b/test/lit/passes/constraint-analysis-loops.wast index 91ad2d6fc62..1d25a520501 100644 --- a/test/lit/passes/constraint-analysis-loops.wast +++ b/test/lit/passes/constraint-analysis-loops.wast @@ -636,7 +636,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.gt_u + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 1) @@ -712,7 +715,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.gt_u + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 1) @@ -801,7 +807,10 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.ge_s + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $x ;; CHECK-NEXT: (i32.add @@ -868,7 +877,10 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.ge_u + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $x ;; CHECK-NEXT: (i32.add @@ -931,7 +943,10 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.ge_s + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $x ;; CHECK-NEXT: (i32.add @@ -1003,7 +1018,10 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.ge_u + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $x ;; CHECK-NEXT: (i32.add @@ -1079,7 +1097,10 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.ge_s + ;; CHECK-NEXT: (local.get $i) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $i ;; CHECK-NEXT: (i32.add @@ -1105,7 +1126,10 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.ge_s + ;; CHECK-NEXT: (local.get $j) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $j ;; CHECK-NEXT: (i32.add @@ -1216,7 +1240,10 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.ge_s + ;; CHECK-NEXT: (local.get $i) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block $in ;; CHECK-NEXT: (local.set $j @@ -1236,7 +1263,10 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.ge_s + ;; CHECK-NEXT: (local.get $j) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $j ;; CHECK-NEXT: (i32.add @@ -1354,7 +1384,10 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.ge_s + ;; CHECK-NEXT: (local.get $i) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $i ;; CHECK-NEXT: (i32.add @@ -1476,15 +1509,109 @@ ) ) + ;; CHECK: (func $add-overflow (type $1) (param $x i32) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.ge_s + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.gt_s + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) (func $add-overflow (param $x i32) (if - (i32.ge_s (local.get $x) (i32.const 0)) + (i32.ge_s + (local.get $x) + (i32.const 0) + ) (then - ;; The add here overflows if we are called with MAX_INT. We must - ;; not misoptimize the operation after us to 1 - that is true in all - ;; cases *except* for the add overflowing. - (local.set $x (i32.add (local.get $x) (i32.const 1))) - (drop (i32.gt_s (local.get $x) (i32.const 0))) + ;; Normally, x >= 0 and x++ lead to x > 0. However, we overflow if + ;; x == MAX_INT, so we cannot optimize the dropped value below us. + (local.set $x + (i32.add + (local.get $x) + (i32.const 1) + ) + ) + (drop + (i32.gt_s + (local.get $x) + (i32.const 0) + ) + ) + ) + ) + ) + + ;; CHECK: (func $add-overflow-yes (type $1) (param $x i32) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.ge_s + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.le_s + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1000) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $add-overflow-yes (param $x i32) + ;; As above, but we add an inner if that does x < 1000. Now x cannot be + ;; MAX_INT, so we do optimize to 1. + (if + (i32.ge_s + (local.get $x) + (i32.const 0) + ) + (then + (if + (i32.le_s + (local.get $x) + (i32.const 1000) + ) + (then + (local.set $x + (i32.add + (local.get $x) + (i32.const 1) + ) + ) + (drop + (i32.gt_s + (local.get $x) + (i32.const 0) + ) + ) + ) + ) ) ) ) From d6c1a3c7aaaa2f4ba6de147f7384c4295cad366e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 15:03:51 -0700 Subject: [PATCH 42/93] work --- .../lit/passes/constraint-analysis-loops.wast | 150 +++++++++++++++--- 1 file changed, 129 insertions(+), 21 deletions(-) diff --git a/test/lit/passes/constraint-analysis-loops.wast b/test/lit/passes/constraint-analysis-loops.wast index 1d25a520501..389216d5f31 100644 --- a/test/lit/passes/constraint-analysis-loops.wast +++ b/test/lit/passes/constraint-analysis-loops.wast @@ -6,7 +6,7 @@ ;; CHECK: (import "a" "b" (func $import (type $2) (result i32))) (import "a" "b" (func $import (result i32))) - ;; CHECK: (func $infinite-loop (type $0) + ;; CHECK: (func $infinite-loop (type $1) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (loop $loop ;; CHECK-NEXT: (local.set $x @@ -32,7 +32,7 @@ ) ) - ;; CHECK: (func $almost-infinite-loop (type $0) + ;; CHECK: (func $almost-infinite-loop (type $1) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (loop $loop ;; CHECK-NEXT: (local.set $x @@ -64,7 +64,7 @@ ) ) - ;; CHECK: (func $bound (type $0) + ;; CHECK: (func $bound (type $1) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (loop $loop ;; CHECK-NEXT: (drop @@ -138,7 +138,7 @@ ) ) - ;; CHECK: (func $bound-flipped-ifs (type $0) + ;; CHECK: (func $bound-flipped-ifs (type $1) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (loop $loop ;; CHECK-NEXT: (drop @@ -208,7 +208,7 @@ ) ) - ;; CHECK: (func $bound-nonconstant-no (type $1) (param $p i32) + ;; CHECK: (func $bound-nonconstant-no (type $0) (param $p i32) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (loop $loop ;; CHECK-NEXT: (drop @@ -285,7 +285,7 @@ ) ) - ;; CHECK: (func $bound-incremented (type $0) + ;; CHECK: (func $bound-incremented (type $1) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (loop $loop ;; CHECK-NEXT: (drop @@ -347,7 +347,7 @@ ) ) - ;; CHECK: (func $bound-incremented-unsigned (type $0) + ;; CHECK: (func $bound-incremented-unsigned (type $1) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (loop $loop ;; CHECK-NEXT: (drop @@ -407,7 +407,7 @@ ) ) - ;; CHECK: (func $bound-incremented-while (type $0) + ;; CHECK: (func $bound-incremented-while (type $1) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (block $out ;; CHECK-NEXT: (loop $loop @@ -477,7 +477,7 @@ ) ) - ;; CHECK: (func $bound-incremented-inc-first (type $0) + ;; CHECK: (func $bound-incremented-inc-first (type $1) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (block $out ;; CHECK-NEXT: (loop $loop @@ -547,7 +547,7 @@ ) ) - ;; CHECK: (func $bound-incremented-inc-first-less (type $0) + ;; CHECK: (func $bound-incremented-inc-first-less (type $1) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (block $out ;; CHECK-NEXT: (loop $loop @@ -616,7 +616,7 @@ ) ) - ;; CHECK: (func $bound-incremented-inc-first-less-unsigned (type $0) + ;; CHECK: (func $bound-incremented-inc-first-less-unsigned (type $1) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (block $out ;; CHECK-NEXT: (loop $loop @@ -686,7 +686,7 @@ ) ) - ;; CHECK: (func $extra-constraint (type $0) + ;; CHECK: (func $extra-constraint (type $1) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (block $out ;; CHECK-NEXT: (loop $loop @@ -790,7 +790,7 @@ ) ) - ;; CHECK: (func $while-nonconstant (type $1) (param $len i32) + ;; CHECK: (func $while-nonconstant (type $0) (param $len i32) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (block $out ;; CHECK-NEXT: (loop $loop @@ -860,7 +860,7 @@ ) ) - ;; CHECK: (func $while-nonconstant-unsigned (type $1) (param $len i32) + ;; CHECK: (func $while-nonconstant-unsigned (type $0) (param $len i32) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (block $out ;; CHECK-NEXT: (loop $loop @@ -930,7 +930,7 @@ ) ) - ;; CHECK: (func $do-nonconstant (type $1) (param $len i32) + ;; CHECK: (func $do-nonconstant (type $0) (param $len i32) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.lt_s @@ -1005,7 +1005,7 @@ ) ) - ;; CHECK: (func $do-nonconstant-unsigned (type $1) (param $len i32) + ;; CHECK: (func $do-nonconstant-unsigned (type $0) (param $len i32) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.lt_u @@ -1079,7 +1079,7 @@ ) ) - ;; CHECK: (func $nested (type $1) (param $len i32) + ;; CHECK: (func $nested (type $0) (param $len i32) ;; CHECK-NEXT: (local $i i32) ;; CHECK-NEXT: (local $j i32) ;; CHECK-NEXT: (block $out @@ -1222,7 +1222,7 @@ ) ) - ;; CHECK: (func $nested-increment-i-later (type $1) (param $len i32) + ;; CHECK: (func $nested-increment-i-later (type $0) (param $len i32) ;; CHECK-NEXT: (local $i i32) ;; CHECK-NEXT: (local $j i32) ;; CHECK-NEXT: (block $out @@ -1366,7 +1366,7 @@ ) ) - ;; CHECK: (func $nested-from-nonconstant-no (type $1) (param $len i32) + ;; CHECK: (func $nested-from-nonconstant-no (type $0) (param $len i32) ;; CHECK-NEXT: (local $i i32) ;; CHECK-NEXT: (local $j i32) ;; CHECK-NEXT: (block $out @@ -1509,7 +1509,7 @@ ) ) - ;; CHECK: (func $add-overflow (type $1) (param $x i32) + ;; CHECK: (func $add-overflow (type $0) (param $x i32) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.ge_s ;; CHECK-NEXT: (local.get $x) @@ -1556,7 +1556,7 @@ ) ) - ;; CHECK: (func $add-overflow-yes (type $1) (param $x i32) + ;; CHECK: (func $add-overflow-yes (type $0) (param $x i32) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.ge_s ;; CHECK-NEXT: (local.get $x) @@ -1615,4 +1615,112 @@ ) ) ) + + ;; CHECK: (func $add-overflow-unsigned (type $0) (param $x i32) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.ge_u + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.gt_u + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $add-overflow-unsigned (param $x i32) + ;; As above, but unsigned. We change the 0 to 1, as x >= 0 is always true + ;; for unsigned anyhow. + (if + (i32.ge_u + (local.get $x) + (i32.const 1) + ) + (then + (local.set $x + (i32.add + (local.get $x) + (i32.const 1) + ) + ) + ;; We do not optimize, due to the risk of overflow. + (drop + (i32.gt_u + (local.get $x) + (i32.const 1) + ) + ) + ) + ) + ) + + ;; CHECK: (func $add-overflow-unsigned-yes (type $0) (param $x i32) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.ge_u + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.le_u + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1000) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $add-overflow-unsigned-yes (param $x i32) + ;; As above, but unsigned. + (if + (i32.ge_u + (local.get $x) + (i32.const 1) + ) + (then + (if + (i32.le_u + (local.get $x) + (i32.const 1000) + ) + (then + (local.set $x + (i32.add + (local.get $x) + (i32.const 1) + ) + ) + ;; We do optimize to 1. + (drop + (i32.gt_u + (local.get $x) + (i32.const 1) + ) + ) + ) + ) + ) + ) + ) ) From c4942472e69bc11c7d6787fffc5d99c2315b4494 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 15:05:06 -0700 Subject: [PATCH 43/93] work --- src/ir/constraint.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 160445f9e3b..94f0c3267f3 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -663,6 +663,8 @@ void BasicBlockConstraintMap::set(Index index, Expression* value) { auto new_ = old; // Iterate over the old constraints and increment each one. + // TODO: We could add new ones too. E.g. if x does not overflow, then after + // x++ we have x > 0 (unsigned). for (auto iter = new_.begin(); iter != new_.end();) { auto& c = *iter; auto* N = std::get_if(&c.term); From dd60469afccdc600c6ce484812cd64c6ad0fe0af Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 15:06:00 -0700 Subject: [PATCH 44/93] work --- test/lit/passes/constraint-analysis-loops.wast | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/lit/passes/constraint-analysis-loops.wast b/test/lit/passes/constraint-analysis-loops.wast index 389216d5f31..59cb5dd88fb 100644 --- a/test/lit/passes/constraint-analysis-loops.wast +++ b/test/lit/passes/constraint-analysis-loops.wast @@ -668,7 +668,7 @@ (br $out) ) ) - ;; x > 0 && x <= 100 here (but we need loops mode to get both). + ;; x > 0 && x <= 100 here (but we need loops mode to get both). XXX (drop (i32.gt_u (local.get $x) From 195d7868ae28c0bf2ac7efc96496bbb08bf70def Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 16:20:34 -0700 Subject: [PATCH 45/93] work --- src/ir/constraint.cpp | 21 +++++++++++++++++++-- test/gtest/constraint.cpp | 23 +++++++++++++++++++---- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 94f0c3267f3..e25c0ed2c78 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -662,9 +662,17 @@ void BasicBlockConstraintMap::set(Index index, Expression* value) { const auto old = get(y); auto new_ = old; + // If we see an unsigned upper bound but not a lower one, we can add a + // lower one (if we do not overflow). That is, if we see x < 100, x++, then + // we can not only update x < 100 to x <= 100, but also add x > 0 (since 0 + // is impossible after the ++). This is not possible for signed operations, + // since x++ does not prove x > 0 there (0 is not the only value that is + // <= 0). + bool hasUnsignedUpperBound = false; + bool hasUnsignedLowerBound = false; + Type type; + // Iterate over the old constraints and increment each one. - // TODO: We could add new ones too. E.g. if x does not overflow, then after - // x++ we have x > 0 (unsigned). for (auto iter = new_.begin(); iter != new_.end();) { auto& c = *iter; auto* N = std::get_if(&c.term); @@ -675,6 +683,7 @@ void BasicBlockConstraintMap::set(Index index, Expression* value) { iter = new_.erase(iter); continue; } + type = N->type; switch (c.op) { // x == N, x++ => x == N+1. @@ -702,6 +711,7 @@ void BasicBlockConstraintMap::set(Index index, Expression* value) { break; case LtU: c.op = LeU; + hasUnsignedUpperBound = true; break; // x <= N, x++ => x <= N+1 if no overflow case LeS: @@ -717,6 +727,7 @@ void BasicBlockConstraintMap::set(Index index, Expression* value) { continue; } *N = N->add(Literal::makeFromInt32(1, N->type)); + hasUnsignedUpperBound = true; break; default: // Something we don't recognize. @@ -727,6 +738,12 @@ void BasicBlockConstraintMap::set(Index index, Expression* value) { ++iter; } + if (hasUnsignedUpperBound && !hasUnsignedLowerBound) { + // We know we did not overflow (we are bounded from above), and don't have + // any lower bound, so add x > 0. + new_.approximateAnd({GtU, Literal::makeFromInt32(0, type)}); + } + set(index, new_); return; } diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index 751bd2f7f6d..72a37d6ff6f 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -592,16 +592,31 @@ TEST(ConstraintTest, TestIncrement) { map.set(0, &add); check(map.get(0), {Eq, {Literal(int32_t(1))}}); - // $0 >= 5, $0++ => $0 > 5 (signed) + // $0 >= 5, $0++ => nothing, since the ++ might overflow into negative map.set(0, {GeS, {Literal(int32_t(5))}}); map.set(0, &add); - check(map.get(0), {GtS, {Literal(int32_t(5))}}); + EXPECT_TRUE(map.get(0).empty()); - // Ditto, unsigned + // $0 >= 5, $0 < 100, $0++ => $0 > 5, $0 <= 100 (signed) + Constraint lts100{LtS, {Literal(int32_t(100))}}; + Constraint les100{LeS, {Literal(int32_t(100))}}; + map.set(0, {{GeS, {Literal(int32_t(5))}}, lts100}); + map.set(0, &add); + EXPECT_EQ(map.get(0), (AndedConstraintSet{{GtS, {Literal(int32_t(5))}}, les100})); + + // Ditto, unsigned: without an upper bound we can overflow. map.set(0, {GeU, {Literal(int32_t(5))}}); map.set(0, &add); - check(map.get(0), {GtU, {Literal(int32_t(5))}}); + EXPECT_TRUE(map.get(0).empty()); + + // With an upper bound, we can optimize like before. + Constraint ltu100{LtU, {Literal(int32_t(100))}}; + Constraint leu100{LeU, {Literal(int32_t(100))}}; + map.set(0, {{GeU, {Literal(int32_t(5))}}, ltu100}); + map.set(0, &add); + EXPECT_EQ(map.get(0), (AndedConstraintSet{{GtU, {Literal(int32_t(5))}}, leu100})); +abort(); // $0 < 5, $0++ => $0 <= 5 (signed) map.set(0, {LtS, {Literal(int32_t(5))}}); map.set(0, &add); From 0a0c0037ed9f91e9d21638a9e173dd42c3a5f74a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 16:23:16 -0700 Subject: [PATCH 46/93] work --- test/gtest/constraint.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index 72a37d6ff6f..72de21e6e12 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -616,17 +616,18 @@ TEST(ConstraintTest, TestIncrement) { map.set(0, &add); EXPECT_EQ(map.get(0), (AndedConstraintSet{{GtU, {Literal(int32_t(5))}}, leu100})); -abort(); // $0 < 5, $0++ => $0 <= 5 (signed) map.set(0, {LtS, {Literal(int32_t(5))}}); map.set(0, &add); check(map.get(0), {LeS, {Literal(int32_t(5))}}); - // Ditto, unsigned + // Ditto, unsigned. We also add a lower bound here, as after $0++, $0 > 0 + // (due to no overflow, proven by the upper bound). + Constraint gtu0{GtU, {Literal(int32_t(0))}}; map.set(0, {LtU, {Literal(int32_t(5))}}); map.set(0, &add); - check(map.get(0), {LeU, {Literal(int32_t(5))}}); - + EXPECT_EQ(map.get(0), (AndedConstraintSet{{LeU, {Literal(int32_t(5))}}, gtu0})); +abort(); // $0 <= 5, $0++ => $0 <= 6 (signed) map.set(0, {LeS, {Literal(int32_t(5))}}); map.set(0, &add); From afb3935a446cd7e83a30ba23eab25a4027136d5a Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 16:24:27 -0700 Subject: [PATCH 47/93] work --- test/gtest/constraint.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index 72de21e6e12..ca9b794338e 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -627,7 +627,7 @@ TEST(ConstraintTest, TestIncrement) { map.set(0, {LtU, {Literal(int32_t(5))}}); map.set(0, &add); EXPECT_EQ(map.get(0), (AndedConstraintSet{{LeU, {Literal(int32_t(5))}}, gtu0})); -abort(); + // $0 <= 5, $0++ => $0 <= 6 (signed) map.set(0, {LeS, {Literal(int32_t(5))}}); map.set(0, &add); @@ -636,7 +636,7 @@ abort(); // Ditto, unsigned map.set(0, {LeU, {Literal(int32_t(5))}}); map.set(0, &add); - check(map.get(0), {LeU, {Literal(int32_t(6))}}); + EXPECT_EQ(map.get(0), (AndedConstraintSet{{LeU, {Literal(int32_t(6))}}, gtu0})); // $0 <= max_signed, $0++ => nothing, because it would overflow map.set(0, {LeS, {Literal::makeSignedMax(Type::i32)}}); @@ -653,6 +653,7 @@ abort(); map.set(0, &add); auto one = Literal::makeFromInt32(1, Type::i32); check(map.get(0), {LeU, {Literal::makeSignedMax(Type::i32).add(one)}}); +abort(); // Multiple constraints at once: // $0 >= 10 && $0 < 20, $0++ => $0 > 10 && $0 <= 20 From 2530b8bc8f982a8672ec9562672e1bd50c509c62 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 16:25:49 -0700 Subject: [PATCH 48/93] work --- test/gtest/constraint.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index ca9b794338e..76b50ee1852 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -652,8 +652,7 @@ TEST(ConstraintTest, TestIncrement) { map.set(0, {LeU, {Literal::makeSignedMax(Type::i32)}}); map.set(0, &add); auto one = Literal::makeFromInt32(1, Type::i32); - check(map.get(0), {LeU, {Literal::makeSignedMax(Type::i32).add(one)}}); -abort(); + EXPECT_EQ(map.get(0), (AndedConstraintSet{{LeU, {Literal::makeSignedMax(Type::i32).add(one)}}, gtu0})); // Multiple constraints at once: // $0 >= 10 && $0 < 20, $0++ => $0 > 10 && $0 <= 20 From ed93ddf5619db1d99ba741180804482c18682145 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 16:29:05 -0700 Subject: [PATCH 49/93] work --- test/gtest/constraint.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index 76b50ee1852..edf77f7d6fe 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -663,18 +663,18 @@ TEST(ConstraintTest, TestIncrement) { (AndedConstraintSet{{GtS, {Literal(int32_t(10))}}, {LeS, {Literal(int32_t(20))}}})); - // $0 >= 10 && $0 <= max_signed, $0++ => $0 > 10 (overflowing constraint - // removed) + // $0 >= 10 && $0 <= max_signed, $0++ => nothing, as we may overflow. map.set(0, {GeS, {Literal(int32_t(10))}}); map.approximateAnd(0, {LeS, {Literal::makeSignedMax(Type::i32)}}); map.set(0, &add); - EXPECT_EQ(map.get(0), (AndedConstraintSet{{GtS, {Literal(int32_t(10))}}})); + EXPECT_EQ(map.get(0).size(), 0); - // $0 >= 10 && $0 == $2, $0++ => $0 > 10 (non-constant term removed) - map.set(0, {GeS, {Literal(int32_t(10))}}); + // $0 >= 5 && $0 < 100 && $0 != $2, $0++ => we increment and remove the non- + // constant term, leaving $0 >= 6 && $0 <= 100. + map.set(0, {{GeS, {Literal(int32_t(5))}}, lts100}); map.approximateAnd(0, {Eq, {Index(2)}}); map.set(0, &add); - EXPECT_EQ(map.get(0), (AndedConstraintSet{{GtS, {Literal(int32_t(10))}}})); + EXPECT_EQ(map.get(0), (AndedConstraintSet{{GtS, {Literal(int32_t(5))}}, les100})); } TEST(ConstraintTest, TestEqConstraints) { From 00a6dccff6a7b4de419fae36e194206ac5109d84 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 16:29:10 -0700 Subject: [PATCH 50/93] work --- test/gtest/constraint.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index edf77f7d6fe..1d854b028a9 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -602,7 +602,8 @@ TEST(ConstraintTest, TestIncrement) { Constraint les100{LeS, {Literal(int32_t(100))}}; map.set(0, {{GeS, {Literal(int32_t(5))}}, lts100}); map.set(0, &add); - EXPECT_EQ(map.get(0), (AndedConstraintSet{{GtS, {Literal(int32_t(5))}}, les100})); + EXPECT_EQ(map.get(0), + (AndedConstraintSet{{GtS, {Literal(int32_t(5))}}, les100})); // Ditto, unsigned: without an upper bound we can overflow. map.set(0, {GeU, {Literal(int32_t(5))}}); @@ -614,7 +615,8 @@ TEST(ConstraintTest, TestIncrement) { Constraint leu100{LeU, {Literal(int32_t(100))}}; map.set(0, {{GeU, {Literal(int32_t(5))}}, ltu100}); map.set(0, &add); - EXPECT_EQ(map.get(0), (AndedConstraintSet{{GtU, {Literal(int32_t(5))}}, leu100})); + EXPECT_EQ(map.get(0), + (AndedConstraintSet{{GtU, {Literal(int32_t(5))}}, leu100})); // $0 < 5, $0++ => $0 <= 5 (signed) map.set(0, {LtS, {Literal(int32_t(5))}}); @@ -626,7 +628,8 @@ TEST(ConstraintTest, TestIncrement) { Constraint gtu0{GtU, {Literal(int32_t(0))}}; map.set(0, {LtU, {Literal(int32_t(5))}}); map.set(0, &add); - EXPECT_EQ(map.get(0), (AndedConstraintSet{{LeU, {Literal(int32_t(5))}}, gtu0})); + EXPECT_EQ(map.get(0), + (AndedConstraintSet{{LeU, {Literal(int32_t(5))}}, gtu0})); // $0 <= 5, $0++ => $0 <= 6 (signed) map.set(0, {LeS, {Literal(int32_t(5))}}); @@ -636,7 +639,8 @@ TEST(ConstraintTest, TestIncrement) { // Ditto, unsigned map.set(0, {LeU, {Literal(int32_t(5))}}); map.set(0, &add); - EXPECT_EQ(map.get(0), (AndedConstraintSet{{LeU, {Literal(int32_t(6))}}, gtu0})); + EXPECT_EQ(map.get(0), + (AndedConstraintSet{{LeU, {Literal(int32_t(6))}}, gtu0})); // $0 <= max_signed, $0++ => nothing, because it would overflow map.set(0, {LeS, {Literal::makeSignedMax(Type::i32)}}); @@ -652,7 +656,9 @@ TEST(ConstraintTest, TestIncrement) { map.set(0, {LeU, {Literal::makeSignedMax(Type::i32)}}); map.set(0, &add); auto one = Literal::makeFromInt32(1, Type::i32); - EXPECT_EQ(map.get(0), (AndedConstraintSet{{LeU, {Literal::makeSignedMax(Type::i32).add(one)}}, gtu0})); + EXPECT_EQ(map.get(0), + (AndedConstraintSet{ + {LeU, {Literal::makeSignedMax(Type::i32).add(one)}}, gtu0})); // Multiple constraints at once: // $0 >= 10 && $0 < 20, $0++ => $0 > 10 && $0 <= 20 @@ -674,7 +680,8 @@ TEST(ConstraintTest, TestIncrement) { map.set(0, {{GeS, {Literal(int32_t(5))}}, lts100}); map.approximateAnd(0, {Eq, {Index(2)}}); map.set(0, &add); - EXPECT_EQ(map.get(0), (AndedConstraintSet{{GtS, {Literal(int32_t(5))}}, les100})); + EXPECT_EQ(map.get(0), + (AndedConstraintSet{{GtS, {Literal(int32_t(5))}}, les100})); } TEST(ConstraintTest, TestEqConstraints) { From 6f4527571a883a73097e14f5a6d21d2a7f97c365 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 16:29:26 -0700 Subject: [PATCH 51/93] work --- test/lit/passes/constraint-analysis-loops.wast | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/test/lit/passes/constraint-analysis-loops.wast b/test/lit/passes/constraint-analysis-loops.wast index 59cb5dd88fb..34a12158941 100644 --- a/test/lit/passes/constraint-analysis-loops.wast +++ b/test/lit/passes/constraint-analysis-loops.wast @@ -636,10 +636,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.gt_u - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 1) @@ -715,10 +712,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.gt_u - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 1) From 2188b3720e06681a45c196d6c3ec21109fbc0116 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 16:58:12 -0700 Subject: [PATCH 52/93] feedback --- src/support/span.h | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/support/span.h b/src/support/span.h index dbd301089cd..56f070c06c2 100644 --- a/src/support/span.h +++ b/src/support/span.h @@ -43,16 +43,14 @@ template struct Span { // To represent an empty span, we use min > max, an impossible span. void setEmpty() { - min = 1; - max = 0; + *this = empty(); + assert(isEmpty()); } bool isEmpty() const { return min > max; } static Span empty() { - Span ret; - ret.setEmpty(); - return ret; + return Span{Max, Min}; } void setFull() { @@ -63,9 +61,7 @@ template struct Span { bool isFull() const { return min == Min && max == Max; } static Span full() { - Span ret; - ret.setFull(); - return ret; + return Span{}; } // Intersect this with another span, returning a (possibly empty) span. From 073fbaf77727eeb8baedde156056a930ca362dd8 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 19 Aug 2026 16:58:18 -0700 Subject: [PATCH 53/93] format --- src/support/span.h | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/support/span.h b/src/support/span.h index 56f070c06c2..05cdbce65a9 100644 --- a/src/support/span.h +++ b/src/support/span.h @@ -49,9 +49,7 @@ template struct Span { bool isEmpty() const { return min > max; } - static Span empty() { - return Span{Max, Min}; - } + static Span empty() { return Span{Max, Min}; } void setFull() { *this = Span(); @@ -60,9 +58,7 @@ template struct Span { bool isFull() const { return min == Min && max == Max; } - static Span full() { - return Span{}; - } + static Span full() { return Span{}; } // Intersect this with another span, returning a (possibly empty) span. Span intersection(const Span& other) const { From e14eaf0081727df6db85759905d84a0e180fb3d8 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 20 Aug 2026 09:02:06 -0700 Subject: [PATCH 54/93] todos --- src/ir/constraint.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index b096194324f..c64c7313a52 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -344,6 +344,8 @@ void AndedConstraintSet::approximateAnd(const Constraint& c) { } } + // TODO: use Spans here when possible + if (size() < MaxConstraints) { // Insert into the right place, keeping us sorted. insert(std::upper_bound(begin(), end(), c), c); @@ -505,6 +507,8 @@ bool AndedConstraintSet::approximateOr(const AndedConstraintSet& other) { return true; } + // TODO: use Spans here when possible + // For more complex cases, do a detailed analysis. auto result = detailedApproximateOr(*this, other); auto changed = (result != *this); From d332f0f166959596ffad066dbf9cd508da1a695e Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 20 Aug 2026 09:31:13 -0700 Subject: [PATCH 55/93] fix --- src/ir/constraint.cpp | 45 ++++++++++++++----- .../lit/passes/constraint-analysis-loops.wast | 2 +- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index c64c7313a52..bfd2eb7a60d 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -644,37 +644,50 @@ void BasicBlockConstraintMap::set(Index index, Expression* value) { // Apply a constraint to a value, x = C. if (Properties::isSingleConstantExpression(value)) { auto c = Properties::getLiteral(value); - set(index, Constraint{Abstract::Eq, {c}}); + set(index, Constraint{Eq, {c}}); return; } // Apply a constraint to a local, x = y. if (auto* get = value->dynCast()) { - set(index, Constraint{Abstract::Eq, {get->index}}); + set(index, Constraint{Eq, {get->index}}); return; } if (auto* tee = value->dynCast()) { - set(index, Constraint{Abstract::Eq, {tee->index}}); + set(index, Constraint{Eq, {tee->index}}); return; } // Apply an increment of a local, x = y + 1. Index y; - if (matches(value, binary(Abstract::Add, local(&y), ival(1)))) { - // The local y must have old constraints that we know how to increment. - auto old = get(y); + if (matches(value, binary(Add, local(&y), ival(1)))) { + // The local y must have old constraints that we know how to increment and + // transform into new ones. + const auto old = get(y); + auto new_ = old; + + // If we see an unsigned upper bound but not a lower one, we can add a + // lower one (if we do not overflow). That is, if we see x < 100, x++, then + // we can not only update x < 100 to x <= 100, but also add x > 0 (since 0 + // is impossible after the ++). This is not possible for signed operations, + // since x++ does not prove x > 0 there (0 is not the only value that is + // <= 0). + bool hasUnsignedUpperBound = false; + bool hasUnsignedLowerBound = false; + Type type; // Iterate over the old constraints and increment each one. - for (auto iter = old.begin(); iter != old.end();) { + for (auto iter = new_.begin(); iter != new_.end();) { auto& c = *iter; auto* N = std::get_if(&c.term); if (!N) { // A non-constant term, which we don't know how to increment. Simply // remove it: we are losing proving power here, but doing so is never // invalid. - iter = old.erase(iter); + iter = new_.erase(iter); continue; } + type = N->type; switch (c.op) { // x == N, x++ => x == N+1. @@ -694,32 +707,40 @@ void BasicBlockConstraintMap::set(Index index, Expression* value) { break; case LtU: c.op = LeU; + hasUnsignedUpperBound = true; break; // x <= N, x++ => x <= N+1 if no overflow case LeS: if (N->isSignedMax()) { - iter = old.erase(iter); + iter = new_.erase(iter); continue; } *N = N->add(Literal::makeFromInt32(1, N->type)); break; case LeU: if (N->isUnsignedMax()) { - iter = old.erase(iter); + iter = new_.erase(iter); continue; } *N = N->add(Literal::makeFromInt32(1, N->type)); + hasUnsignedUpperBound = true; break; default: // Something we don't recognize. - iter = old.erase(iter); + iter = new_.erase(iter); continue; } ++iter; } - set(index, old); + if (hasUnsignedUpperBound && !hasUnsignedLowerBound) { + // We know we did not overflow (we are bounded from above), and don't have + // any lower bound, so add x > 0. + new_.approximateAnd({GtU, Literal::makeFromInt32(0, type)}); + } + + set(index, new_); return; } diff --git a/test/lit/passes/constraint-analysis-loops.wast b/test/lit/passes/constraint-analysis-loops.wast index 9e503b01e95..5d7f122a69a 100644 --- a/test/lit/passes/constraint-analysis-loops.wast +++ b/test/lit/passes/constraint-analysis-loops.wast @@ -665,7 +665,7 @@ (br $out) ) ) - ;; x > 0 && x <= 100 here (but we need loops mode to get both). + ;; x > 0 && x <= 100 here. (drop (i32.gt_u (local.get $x) From 818b9c565d6687728517770da43a13fdafc122f2 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 20 Aug 2026 09:48:54 -0700 Subject: [PATCH 56/93] fix --- test/gtest/constraint.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index 751bd2f7f6d..47039f1ac0b 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -607,10 +607,13 @@ TEST(ConstraintTest, TestIncrement) { map.set(0, &add); check(map.get(0), {LeS, {Literal(int32_t(5))}}); - // Ditto, unsigned + // Ditto, unsigned. We also add a lower bound here, as after $0++, $0 > 0 + // (due to no overflow, proven by the upper bound). + Constraint gtu0{GtU, {Literal(int32_t(0))}}; map.set(0, {LtU, {Literal(int32_t(5))}}); map.set(0, &add); - check(map.get(0), {LeU, {Literal(int32_t(5))}}); + EXPECT_EQ(map.get(0), + (AndedConstraintSet{{LeU, {Literal(int32_t(5))}}, gtu0})); // $0 <= 5, $0++ => $0 <= 6 (signed) map.set(0, {LeS, {Literal(int32_t(5))}}); @@ -620,7 +623,8 @@ TEST(ConstraintTest, TestIncrement) { // Ditto, unsigned map.set(0, {LeU, {Literal(int32_t(5))}}); map.set(0, &add); - check(map.get(0), {LeU, {Literal(int32_t(6))}}); + EXPECT_EQ(map.get(0), + (AndedConstraintSet{{LeU, {Literal(int32_t(6))}}, gtu0})); // $0 <= max_signed, $0++ => nothing, because it would overflow map.set(0, {LeS, {Literal::makeSignedMax(Type::i32)}}); @@ -636,7 +640,9 @@ TEST(ConstraintTest, TestIncrement) { map.set(0, {LeU, {Literal::makeSignedMax(Type::i32)}}); map.set(0, &add); auto one = Literal::makeFromInt32(1, Type::i32); - check(map.get(0), {LeU, {Literal::makeSignedMax(Type::i32).add(one)}}); + EXPECT_EQ(map.get(0), + (AndedConstraintSet{ + {LeU, {Literal::makeSignedMax(Type::i32).add(one)}}, gtu0})); // Multiple constraints at once: // $0 >= 10 && $0 < 20, $0++ => $0 > 10 && $0 <= 20 From e8bec8cddb39d80a9d628ccfaa52b2832d907797 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 20 Aug 2026 09:57:21 -0700 Subject: [PATCH 57/93] fix --- src/ir/constraint.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ir/constraint.h b/src/ir/constraint.h index 1bfea0ad8ef..85280dcbd1e 100644 --- a/src/ir/constraint.h +++ b/src/ir/constraint.h @@ -67,7 +67,7 @@ struct Constraint { } // Convert the constraint into a constant span, if possible. For example, - // "< 100 (unsigned)" turns into the span [0, 100]. + // "<= 100 (unsigned)" turns into the span [0, 100]. std::optional> getSpan() const; }; From 2f06af40a65ddebae6fb52ab5967e3ecb07d4a2f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 20 Aug 2026 11:06:04 -0700 Subject: [PATCH 58/93] braces --- src/ir/constraint.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index bfd2eb7a60d..7d02345ac1a 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -159,8 +159,8 @@ Result provesConstantPair(Abstract::Op aOp, } // If we can represent both as spans, we can calculate that way. - if (auto aSpan = Constraint{aOp, aConstant}.getSpan()) { - if (auto bSpan = Constraint{bOp, bConstant}.getSpan()) { + if (auto aSpan = Constraint{aOp, {aConstant}}.getSpan()) { + if (auto bSpan = Constraint{bOp, {bConstant}}.getSpan()) { if (aSpan->isEmpty()) { // An empty span implies a contradiction (e.g. x > MAX_INT), as it means // no possible number can apply. And contradictions prove anything. @@ -737,7 +737,7 @@ void BasicBlockConstraintMap::set(Index index, Expression* value) { if (hasUnsignedUpperBound && !hasUnsignedLowerBound) { // We know we did not overflow (we are bounded from above), and don't have // any lower bound, so add x > 0. - new_.approximateAnd({GtU, Literal::makeFromInt32(0, type)}); + new_.approximateAnd({GtU, {Literal::makeFromInt32(0, type)}}); } set(index, new_); From 9509fcee752512439cf85fadad091198a7bd5be4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 20 Aug 2026 11:40:10 -0700 Subject: [PATCH 59/93] fix --- src/passes/ConstraintAnalysis.cpp | 16 +++---- .../lit/passes/constraint-analysis-loops.wast | 47 ++++++++++++++++++- 2 files changed, 53 insertions(+), 10 deletions(-) diff --git a/src/passes/ConstraintAnalysis.cpp b/src/passes/ConstraintAnalysis.cpp index b835e292e8a..324e2ef0312 100644 --- a/src/passes/ConstraintAnalysis.cpp +++ b/src/passes/ConstraintAnalysis.cpp @@ -517,15 +517,12 @@ struct ConstraintAnalysis // incremented and loop again, leading to [0, 2] and so forth, only stopping // when it reaches the loop bound, which may be very high. We don't want to // spend significant time on such constant operations, as other passes will - // propagate them anyhow, so we verify that we don't apply such x = y + 1 - // operations a ridiculous number of times (enough that it suggests we are - // in that bad situation where we increment until an integer overflow). -#ifndef NDEBUG - static const Index MaxBinaryActions = 1024 * 1024; + // propagate them anyhow, so we stop before applying such x = y + 1 + // operations a ridiculous number of times, by widening to a worst case. + static const Index MaxBinaryActions = 20; // How many times we processed each Binary action. std::unordered_map binaryActionCounts; -#endif // Given an expression, apply it to the constraints. For example, a local.set // sets the value for that local. @@ -537,12 +534,13 @@ struct ConstraintAnalysis return; } -#ifndef NDEBUG // See above on binary action counting limits. if (auto* binary = set->value->dynCast()) { - assert(binaryActionCounts[binary]++ <= MaxBinaryActions); + if (binaryActionCounts[binary]++ >= MaxBinaryActions) { + constraints.setProvesNothing(set->index); + return; + } } -#endif // Look at the fallthrough. It is valid to do so, because our constraints // only track two things, constants and locals. For a constant, it does diff --git a/test/lit/passes/constraint-analysis-loops.wast b/test/lit/passes/constraint-analysis-loops.wast index 9e503b01e95..a865c5b8651 100644 --- a/test/lit/passes/constraint-analysis-loops.wast +++ b/test/lit/passes/constraint-analysis-loops.wast @@ -64,6 +64,51 @@ ) ) + ;; CHECK: (func $infinite-loop-with-branch (type $0) + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (loop $loop + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.gt_s + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $loop) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $infinite-loop-with-branch + (local $x i32) + ;; An infinite loop that *looks* like it might not be infinite. We have a + ;; branch with a loop-like condition, but it is just a nop. + (loop $loop + (if + (i32.gt_s + (local.get $x) + (i32.const 0) + ) + (then + (nop) + ) + ) + (local.set $x + (i32.add + (local.get $x) + (i32.const 1) + ) + ) + (br $loop) + ) + ) + ;; CHECK: (func $bound (type $0) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (loop $loop @@ -665,7 +710,7 @@ (br $out) ) ) - ;; x > 0 && x <= 100 here (but we need loops mode to get both). + ;; x > 0 && x <= 100 here. (drop (i32.gt_u (local.get $x) From 7659e7c72404465d3082a406a46e524392cb2509 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 20 Aug 2026 16:51:39 -0700 Subject: [PATCH 60/93] simpl --- src/ir/constraint.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 7d02345ac1a..44009e02ec3 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -673,7 +673,6 @@ void BasicBlockConstraintMap::set(Index index, Expression* value) { // since x++ does not prove x > 0 there (0 is not the only value that is // <= 0). bool hasUnsignedUpperBound = false; - bool hasUnsignedLowerBound = false; Type type; // Iterate over the old constraints and increment each one. @@ -734,9 +733,8 @@ void BasicBlockConstraintMap::set(Index index, Expression* value) { ++iter; } - if (hasUnsignedUpperBound && !hasUnsignedLowerBound) { - // We know we did not overflow (we are bounded from above), and don't have - // any lower bound, so add x > 0. + if (hasUnsignedUpperBound) { + // We know we did not overflow (we are bounded from above), so add x > 0. new_.approximateAnd({GtU, {Literal::makeFromInt32(0, type)}}); } From 0f051c97da98be9ea10aa7572ae7d264f58f63b7 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 08:25:21 -0700 Subject: [PATCH 61/93] undo --- src/passes/pass.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp index 970e3fddfb5..f178772290a 100644 --- a/src/passes/pass.cpp +++ b/src/passes/pass.cpp @@ -740,9 +740,6 @@ void PassRunner::addDefaultFunctionOptimizationPasses() { "remove-unused-brs"); // coalesce-locals opens opportunities addIfNoDWARFIssues( "remove-unused-names"); // remove-unused-brs opens opportunities - if (options.optimizeLevel >= 3 || options.shrinkLevel >= 1) { - addIfNoDWARFIssues("constraint-analysis"); - } addIfNoDWARFIssues("merge-blocks"); // clean up new blocks from last passes // late propagation if (options.optimizeLevel >= 3 || options.shrinkLevel >= 2) { From 578362cceb436f10b010e6186b1186b30f184b1b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 08:27:05 -0700 Subject: [PATCH 62/93] undo --- test/passes/fannkuch3_manyopts_dwarf.bin.txt | 4133 +++++++++--------- 1 file changed, 2080 insertions(+), 2053 deletions(-) diff --git a/test/passes/fannkuch3_manyopts_dwarf.bin.txt b/test/passes/fannkuch3_manyopts_dwarf.bin.txt index 0d79097a275..98d1c7bb8e9 100644 --- a/test/passes/fannkuch3_manyopts_dwarf.bin.txt +++ b/test/passes/fannkuch3_manyopts_dwarf.bin.txt @@ -2303,7 +2303,7 @@ Contains section .debug_info (851 bytes) Contains section .debug_loc (1073 bytes) Contains section .debug_ranges (88 bytes) Contains section .debug_abbrev (333 bytes) -Contains section .debug_line (2618 bytes) +Contains section .debug_line (2642 bytes) Contains section .debug_str (434 bytes) .debug_abbrev contents: @@ -2469,8 +2469,8 @@ Abbrev table for offset: 0x00000000 DW_AT_comp_dir [DW_FORM_strp] ( .debug_str[0x000000a9] = "/usr/local/google/home/azakai/Dev/2-binaryen") DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) DW_AT_ranges [DW_FORM_sec_offset] (0x00000040 - [0x00000006, 0x00000377) - [0x00000379, 0x00000658)) + [0x00000006, 0x00000381) + [0x00000383, 0x00000662)) 0x00000026: DW_TAG_pointer_type [2] DW_AT_type [DW_FORM_ref4] (cu + 0x002b => {0x0000002b} "worker_args") @@ -2534,7 +2534,7 @@ Abbrev table for offset: 0x00000000 0x00000082: DW_TAG_subprogram [10] * DW_AT_low_pc [DW_FORM_addr] (0x0000000000000006) - DW_AT_high_pc [DW_FORM_data4] (0x00000371) + DW_AT_high_pc [DW_FORM_data4] (0x0000037b) DW_AT_frame_base [DW_FORM_exprloc] (DW_OP_WASM_location 0x1 +0, DW_OP_stack_value) DW_AT_GNU_all_call_sites [DW_FORM_flag_present] (true) DW_AT_linkage_name [DW_FORM_strp] ( .debug_str[0x00000166] = "_Z15fannkuch_workerPv") @@ -2569,13 +2569,13 @@ Abbrev table for offset: 0x00000000 DW_AT_location [DW_FORM_sec_offset] (0x0000001d: [0xffffffff, 0x00000027): [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value - [0x0000003b, 0x00000040): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value + [0x0000003d, 0x00000042): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +1, DW_OP_stack_value - [0x00000103, 0x0000010d): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value + [0x0000010c, 0x00000116): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value - [0x0000022b, 0x00000236): DW_OP_consts +0, DW_OP_stack_value + [0x00000235, 0x00000240): DW_OP_consts +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +1, DW_OP_stack_value - [0x0000027f, 0x00000289): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value + [0x00000289, 0x00000293): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value) DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000d6] = "i") DW_AT_decl_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") @@ -2620,9 +2620,9 @@ Abbrev table for offset: 0x00000000 0x0000010e: DW_TAG_variable [13] DW_AT_location [DW_FORM_sec_offset] (0x0000011d: - [0xffffffff, 0x000001d9): + [0xffffffff, 0x000001e2): [0x00000000, 0x00000005): DW_OP_WASM_location 0x0 +2, DW_OP_stack_value - [0x0000017c, 0x00000181): DW_OP_WASM_location 0x0 +2, DW_OP_stack_value) + [0x0000017d, 0x00000182): DW_OP_WASM_location 0x0 +2, DW_OP_stack_value) DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000014a] = "r") DW_AT_decl_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") DW_AT_decl_line [DW_FORM_data1] (30) @@ -2630,13 +2630,13 @@ Abbrev table for offset: 0x00000000 0x0000011d: DW_TAG_variable [13] DW_AT_location [DW_FORM_sec_offset] (0x00000149: - [0xffffffff, 0x000000ce): + [0xffffffff, 0x000000d7): [0x00000000, 0x00000013): DW_OP_consts +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +13, DW_OP_stack_value [0x00000085, 0x0000008d): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value - [0x00000184, 0x0000018f): DW_OP_consts +0, DW_OP_stack_value + [0x00000185, 0x00000190): DW_OP_consts +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +10, DW_OP_stack_value - [0x00000201, 0x00000209): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value) + [0x00000202, 0x0000020a): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value) DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000155] = "flips") DW_AT_decl_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") DW_AT_decl_line [DW_FORM_data1] (30) @@ -2644,9 +2644,9 @@ Abbrev table for offset: 0x00000000 0x0000012c: DW_TAG_variable [13] DW_AT_location [DW_FORM_sec_offset] (0x000001ab: - [0xffffffff, 0x000000dd): + [0xffffffff, 0x000000e6): [0x00000000, 0x00000004): DW_OP_WASM_location 0x0 +12, DW_OP_stack_value - [0x0000017c, 0x00000180): DW_OP_WASM_location 0x0 +16, DW_OP_stack_value) + [0x0000017d, 0x00000181): DW_OP_WASM_location 0x0 +16, DW_OP_stack_value) DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000019b] = "k") DW_AT_decl_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") DW_AT_decl_line [DW_FORM_data1] (30) @@ -2654,11 +2654,11 @@ Abbrev table for offset: 0x00000000 0x0000013b: DW_TAG_variable [13] DW_AT_location [DW_FORM_sec_offset] (0x000001d7: - [0xffffffff, 0x000000f5): + [0xffffffff, 0x000000fe): [0x00000000, 0x00000004): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value [0x0000003c, 0x0000003f): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value - [0x0000017c, 0x00000180): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value - [0x000001b8, 0x000001bb): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value) + [0x0000017d, 0x00000181): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value + [0x000001b9, 0x000001bc): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value) DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000019d] = "j") DW_AT_decl_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") DW_AT_decl_line [DW_FORM_data1] (30) @@ -2666,11 +2666,11 @@ Abbrev table for offset: 0x00000000 0x0000014a: DW_TAG_variable [13] DW_AT_location [DW_FORM_sec_offset] (0x0000021f: - [0xffffffff, 0x0000010a): + [0xffffffff, 0x00000113): [0x00000000, 0x0000002a): DW_OP_WASM_location 0x0 +15, DW_OP_stack_value [0x0000003b, 0x00000051): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value - [0x0000017c, 0x000001a6): DW_OP_WASM_location 0x0 +14, DW_OP_stack_value - [0x000001b7, 0x000001cd): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value) + [0x0000017d, 0x000001a7): DW_OP_WASM_location 0x0 +14, DW_OP_stack_value + [0x000001b8, 0x000001ce): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value) DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000019f] = "tmp") DW_AT_decl_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") DW_AT_decl_line [DW_FORM_data1] (30) @@ -2678,10 +2678,10 @@ Abbrev table for offset: 0x00000000 0x00000159: DW_TAG_lexical_block [14] * DW_AT_ranges [DW_FORM_sec_offset] (0x00000000 - [0x00000176, 0x000001b4) - [0x000001de, 0x000001e7) - [0x000002f2, 0x00000330) - [0x0000035a, 0x00000363)) + [0x0000017f, 0x000001bd) + [0x000001e7, 0x000001f0) + [0x000002fc, 0x0000033a) + [0x00000364, 0x0000036d)) 0x0000015e: DW_TAG_variable [12] DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000163] = "p0") @@ -2701,19 +2701,19 @@ Abbrev table for offset: 0x00000000 DW_AT_low_pc [DW_FORM_addr] (0x0000000000000041) 0x00000179: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x00000000000000d6) + DW_AT_low_pc [DW_FORM_addr] (0x00000000000000df) 0x0000017e: DW_TAG_GNU_call_site [16] DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x019a => {0x0000019a} "free") - DW_AT_low_pc [DW_FORM_addr] (0x000000000000036c) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000376) 0x00000187: DW_TAG_GNU_call_site [16] DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x019a => {0x0000019a} "free") - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000370) + DW_AT_low_pc [DW_FORM_addr] (0x000000000000037a) 0x00000190: DW_TAG_GNU_call_site [16] DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x019a => {0x0000019a} "free") - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000374) + DW_AT_low_pc [DW_FORM_addr] (0x000000000000037e) 0x00000199: NULL @@ -2817,7 +2817,7 @@ Abbrev table for offset: 0x00000000 0x0000023a: NULL 0x0000023b: DW_TAG_subprogram [23] * - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000379) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000383) DW_AT_high_pc [DW_FORM_data4] (0x000002df) DW_AT_frame_base [DW_FORM_exprloc] (DW_OP_WASM_location 0x0 +2, DW_OP_stack_value) DW_AT_GNU_all_call_sites [DW_FORM_flag_present] (true) @@ -2841,7 +2841,7 @@ Abbrev table for offset: 0x00000000 0x00000269: DW_TAG_variable [13] DW_AT_location [DW_FORM_sec_offset] (0x00000267: - [0xffffffff, 0x000003a5): + [0xffffffff, 0x000003af): [0x00000000, 0x00000005): DW_OP_WASM_location 0x0 +4, DW_OP_stack_value) DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000dc] = "n") DW_AT_decl_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") @@ -2850,8 +2850,8 @@ Abbrev table for offset: 0x00000000 0x00000278: DW_TAG_inlined_subroutine [24] * DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x01a8 => {0x000001a8} "_ZL8fannkuchi") - DW_AT_low_pc [DW_FORM_addr] (0x00000000000003b8) - DW_AT_high_pc [DW_FORM_data4] (0xfffffc48) + DW_AT_low_pc [DW_FORM_addr] (0x00000000000003c2) + DW_AT_high_pc [DW_FORM_data4] (0xfffffc3e) DW_AT_call_file [DW_FORM_data1] ("/usr/local/google/home/azakai/Dev/emscripten/tests/fannkuch.cpp") DW_AT_call_line [DW_FORM_data1] (159) DW_AT_call_column [DW_FORM_data1] (0x29) @@ -2867,14 +2867,14 @@ Abbrev table for offset: 0x00000000 0x00000296: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x000002a2: - [0xffffffff, 0x0000061d): + [0xffffffff, 0x00000627): [0x00000001, 0x00000001): DW_OP_lit0, DW_OP_stack_value [0x00000000, 0x00000018): DW_OP_WASM_location 0x0 +6, DW_OP_stack_value) DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x01ce => {0x000001ce} "args") 0x0000029f: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x000002cc: - [0xffffffff, 0x000003f4): + [0xffffffff, 0x000003fe): [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value [0x00000000, 0x00000005): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value @@ -2891,48 +2891,48 @@ Abbrev table for offset: 0x00000000 0x000002ad: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x00000354: - [0xffffffff, 0x0000040a): + [0xffffffff, 0x00000414): [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value) DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x01ef => {0x000001ef} "perm1") 0x000002b6: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x00000372: - [0xffffffff, 0x00000410): + [0xffffffff, 0x0000041a): [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +5, DW_OP_stack_value) DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x01fa => {0x000001fa} "count") 0x000002bf: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x00000390: - [0xffffffff, 0x0000052d): + [0xffffffff, 0x00000537): [0x00000000, 0x00000007): DW_OP_WASM_location 0x0 +6, DW_OP_stack_value [0x000000be, 0x000000c5): DW_OP_WASM_location 0x0 +6, DW_OP_stack_value) DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x0205 => {0x00000205} "r") 0x000002c8: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x000003e8: - [0xffffffff, 0x00000606): + [0xffffffff, 0x00000610): [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value [0x00000027, 0x0000002f): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value) DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x0210 => {0x00000210} "maxflips") 0x000002d1: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x00000413: - [0xffffffff, 0x00000616): + [0xffffffff, 0x00000620): [0x00000000, 0x0000001f): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value) DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x021b => {0x0000021b} "flips") 0x000002da: DW_TAG_label [28] DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x0226 => {0x00000226} "cleanup") - DW_AT_low_pc [DW_FORM_addr] (0x00000000000005fa) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000604) 0x000002e3: DW_TAG_lexical_block [14] * DW_AT_ranges [DW_FORM_sec_offset] (0x00000028 - [0x000004c3, 0x00000508) - [0x0000057b, 0x000005c6)) + [0x000004cd, 0x00000512) + [0x00000585, 0x000005d0)) 0x000002e8: DW_TAG_variable [26] DW_AT_location [DW_FORM_sec_offset] (0x000003bc: - [0xffffffff, 0x00000584): + [0xffffffff, 0x0000058e): [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +8, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +8, DW_OP_stack_value) DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x022e => {0x0000022e} "p0") @@ -2942,46 +2942,46 @@ Abbrev table for offset: 0x00000000 0x000002f2: NULL 0x000002f3: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x00000000000003a3) + DW_AT_low_pc [DW_FORM_addr] (0x00000000000003ad) 0x000002f8: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x00000000000003b0) + DW_AT_low_pc [DW_FORM_addr] (0x00000000000003ba) 0x000002fd: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x00000000000003d4) + DW_AT_low_pc [DW_FORM_addr] (0x00000000000003de) 0x00000302: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000408) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000412) 0x00000307: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x000000000000040e) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000418) 0x0000030c: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000474) + DW_AT_low_pc [DW_FORM_addr] (0x000000000000047e) 0x00000311: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000486) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000490) 0x00000316: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000544) + DW_AT_low_pc [DW_FORM_addr] (0x000000000000054e) 0x0000031b: DW_TAG_GNU_call_site [16] DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x019a => {0x0000019a} "free") - DW_AT_low_pc [DW_FORM_addr] (0x00000000000005fe) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000608) 0x00000324: DW_TAG_GNU_call_site [16] DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x019a => {0x0000019a} "free") - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000602) + DW_AT_low_pc [DW_FORM_addr] (0x000000000000060c) 0x0000032d: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000614) + DW_AT_low_pc [DW_FORM_addr] (0x000000000000061e) 0x00000332: DW_TAG_GNU_call_site [16] DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x019a => {0x0000019a} "free") - DW_AT_low_pc [DW_FORM_addr] (0x0000000000000621) + DW_AT_low_pc [DW_FORM_addr] (0x000000000000062b) 0x0000033b: DW_TAG_GNU_call_site [15] - DW_AT_low_pc [DW_FORM_addr] (0x000000000000064c) + DW_AT_low_pc [DW_FORM_addr] (0x0000000000000656) 0x00000340: NULL @@ -3006,13 +3006,13 @@ Abbrev table for offset: 0x00000000 0x0000001d: [0xffffffff, 0x00000027): [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value - [0x0000003b, 0x00000040): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value + [0x0000003d, 0x00000042): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +1, DW_OP_stack_value - [0x00000103, 0x0000010d): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value + [0x0000010c, 0x00000116): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value - [0x0000022b, 0x00000236): DW_OP_consts +0, DW_OP_stack_value + [0x00000235, 0x00000240): DW_OP_consts +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +1, DW_OP_stack_value - [0x0000027f, 0x00000289): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value + [0x00000289, 0x00000293): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value 0x000000a5: @@ -3032,40 +3032,40 @@ Abbrev table for offset: 0x00000000 [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +6, DW_OP_stack_value 0x0000011d: - [0xffffffff, 0x000001d9): + [0xffffffff, 0x000001e2): [0x00000000, 0x00000005): DW_OP_WASM_location 0x0 +2, DW_OP_stack_value - [0x0000017c, 0x00000181): DW_OP_WASM_location 0x0 +2, DW_OP_stack_value + [0x0000017d, 0x00000182): DW_OP_WASM_location 0x0 +2, DW_OP_stack_value 0x00000149: - [0xffffffff, 0x000000ce): + [0xffffffff, 0x000000d7): [0x00000000, 0x00000013): DW_OP_consts +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +13, DW_OP_stack_value [0x00000085, 0x0000008d): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value - [0x00000184, 0x0000018f): DW_OP_consts +0, DW_OP_stack_value + [0x00000185, 0x00000190): DW_OP_consts +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +10, DW_OP_stack_value - [0x00000201, 0x00000209): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value + [0x00000202, 0x0000020a): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value 0x000001ab: - [0xffffffff, 0x000000dd): + [0xffffffff, 0x000000e6): [0x00000000, 0x00000004): DW_OP_WASM_location 0x0 +12, DW_OP_stack_value - [0x0000017c, 0x00000180): DW_OP_WASM_location 0x0 +16, DW_OP_stack_value + [0x0000017d, 0x00000181): DW_OP_WASM_location 0x0 +16, DW_OP_stack_value 0x000001d7: - [0xffffffff, 0x000000f5): + [0xffffffff, 0x000000fe): [0x00000000, 0x00000004): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value [0x0000003c, 0x0000003f): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value - [0x0000017c, 0x00000180): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value - [0x000001b8, 0x000001bb): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value + [0x0000017d, 0x00000181): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value + [0x000001b9, 0x000001bc): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value 0x0000021f: - [0xffffffff, 0x0000010a): + [0xffffffff, 0x00000113): [0x00000000, 0x0000002a): DW_OP_WASM_location 0x0 +15, DW_OP_stack_value [0x0000003b, 0x00000051): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value - [0x0000017c, 0x000001a6): DW_OP_WASM_location 0x0 +14, DW_OP_stack_value - [0x000001b7, 0x000001cd): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value + [0x0000017d, 0x000001a7): DW_OP_WASM_location 0x0 +14, DW_OP_stack_value + [0x000001b8, 0x000001ce): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value 0x00000267: - [0xffffffff, 0x000003a5): + [0xffffffff, 0x000003af): [0x00000000, 0x00000005): DW_OP_WASM_location 0x0 +4, DW_OP_stack_value 0x00000285: @@ -3073,12 +3073,12 @@ Abbrev table for offset: 0x00000000 [0x00000001, 0x00000001): DW_OP_consts +30, DW_OP_stack_value 0x000002a2: - [0xffffffff, 0x0000061d): + [0xffffffff, 0x00000627): [0x00000001, 0x00000001): DW_OP_lit0, DW_OP_stack_value [0x00000000, 0x00000018): DW_OP_WASM_location 0x0 +6, DW_OP_stack_value 0x000002cc: - [0xffffffff, 0x000003f4): + [0xffffffff, 0x000003fe): [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value [0x00000000, 0x00000005): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value @@ -3090,36 +3090,36 @@ Abbrev table for offset: 0x00000000 [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value 0x00000354: - [0xffffffff, 0x0000040a): + [0xffffffff, 0x00000414): [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value 0x00000372: - [0xffffffff, 0x00000410): + [0xffffffff, 0x0000041a): [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +5, DW_OP_stack_value 0x00000390: - [0xffffffff, 0x0000052d): + [0xffffffff, 0x00000537): [0x00000000, 0x00000007): DW_OP_WASM_location 0x0 +6, DW_OP_stack_value [0x000000be, 0x000000c5): DW_OP_WASM_location 0x0 +6, DW_OP_stack_value 0x000003bc: - [0xffffffff, 0x00000584): + [0xffffffff, 0x0000058e): [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +8, DW_OP_stack_value [0x00000001, 0x00000001): DW_OP_WASM_location 0x0 +8, DW_OP_stack_value 0x000003e8: - [0xffffffff, 0x00000606): + [0xffffffff, 0x00000610): [0x00000001, 0x00000001): DW_OP_consts +0, DW_OP_stack_value [0x00000027, 0x0000002f): DW_OP_WASM_location 0x0 +0, DW_OP_stack_value 0x00000413: - [0xffffffff, 0x00000616): + [0xffffffff, 0x00000620): [0x00000000, 0x0000001f): DW_OP_WASM_location 0x0 +1, DW_OP_stack_value .debug_line contents: debug_line[0x00000000] Line table prologue: - total_length: 0x00000a36 + total_length: 0x00000a4e version: 4 prologue_length: 0x000000dd min_inst_length: 1 @@ -3204,1408 +3204,1422 @@ file_names[ 4]: 0x000000000000003d 36 18 1 0 0 is_stmt -0x0000012e: 00 DW_LNE_set_address (0x0000000000000045) +0x0000012e: 00 DW_LNE_set_address (0x0000000000000047) 0x00000135: 03 DW_LNS_advance_line (37) 0x00000137: 01 DW_LNS_copy - 0x0000000000000045 37 18 1 0 0 is_stmt + 0x0000000000000047 37 18 1 0 0 is_stmt -0x00000138: 00 DW_LNE_set_address (0x000000000000004e) +0x00000138: 00 DW_LNE_set_address (0x0000000000000050) 0x0000013f: 03 DW_LNS_advance_line (38) 0x00000141: 05 DW_LNS_set_column (7) 0x00000143: 01 DW_LNS_copy - 0x000000000000004e 38 7 1 0 0 is_stmt + 0x0000000000000050 38 7 1 0 0 is_stmt -0x00000144: 00 DW_LNE_set_address (0x0000000000000056) +0x00000144: 00 DW_LNE_set_address (0x0000000000000058) 0x0000014b: 05 DW_LNS_set_column (16) 0x0000014d: 06 DW_LNS_negate_stmt 0x0000014e: 01 DW_LNS_copy - 0x0000000000000056 38 16 1 0 0 + 0x0000000000000058 38 16 1 0 0 -0x0000014f: 00 DW_LNE_set_address (0x000000000000005b) +0x0000014f: 00 DW_LNE_set_address (0x000000000000005d) 0x00000156: 03 DW_LNS_advance_line (37) 0x00000158: 05 DW_LNS_set_column (24) 0x0000015a: 06 DW_LNS_negate_stmt 0x0000015b: 01 DW_LNS_copy - 0x000000000000005b 37 24 1 0 0 is_stmt + 0x000000000000005d 37 24 1 0 0 is_stmt -0x0000015c: 00 DW_LNE_set_address (0x0000000000000060) +0x0000015c: 00 DW_LNE_set_address (0x0000000000000062) 0x00000163: 05 DW_LNS_set_column (18) 0x00000165: 06 DW_LNS_negate_stmt 0x00000166: 01 DW_LNS_copy - 0x0000000000000060 37 18 1 0 0 + 0x0000000000000062 37 18 1 0 0 -0x00000167: 00 DW_LNE_set_address (0x0000000000000065) +0x00000167: 00 DW_LNE_set_address (0x0000000000000067) 0x0000016e: 05 DW_LNS_set_column (4) 0x00000170: 01 DW_LNS_copy - 0x0000000000000065 37 4 1 0 0 + 0x0000000000000067 37 4 1 0 0 -0x00000171: 00 DW_LNE_set_address (0x0000000000000068) +0x00000171: 00 DW_LNE_set_address (0x000000000000006a) 0x00000178: 03 DW_LNS_advance_line (39) 0x0000017a: 06 DW_LNS_negate_stmt 0x0000017b: 01 DW_LNS_copy - 0x0000000000000068 39 4 1 0 0 is_stmt + 0x000000000000006a 39 4 1 0 0 is_stmt -0x0000017c: 00 DW_LNE_set_address (0x000000000000006a) +0x0000017c: 00 DW_LNE_set_address (0x000000000000006c) 0x00000183: 05 DW_LNS_set_column (16) 0x00000185: 06 DW_LNS_negate_stmt 0x00000186: 01 DW_LNS_copy - 0x000000000000006a 39 16 1 0 0 + 0x000000000000006c 39 16 1 0 0 -0x00000187: 00 DW_LNE_set_address (0x0000000000000073) +0x00000187: 00 DW_LNE_set_address (0x0000000000000075) 0x0000018e: 05 DW_LNS_set_column (4) 0x00000190: 01 DW_LNS_copy - 0x0000000000000073 39 4 1 0 0 + 0x0000000000000075 39 4 1 0 0 -0x00000191: 00 DW_LNE_set_address (0x0000000000000075) +0x00000191: 00 DW_LNE_set_address (0x0000000000000077) 0x00000198: 05 DW_LNS_set_column (23) 0x0000019a: 01 DW_LNS_copy - 0x0000000000000075 39 23 1 0 0 + 0x0000000000000077 39 23 1 0 0 -0x0000019b: 00 DW_LNE_set_address (0x000000000000007a) +0x0000019b: 00 DW_LNE_set_address (0x000000000000007c) 0x000001a2: 05 DW_LNS_set_column (19) 0x000001a4: 01 DW_LNS_copy - 0x000000000000007a 39 19 1 0 0 + 0x000000000000007c 39 19 1 0 0 -0x000001a5: 00 DW_LNE_set_address (0x000000000000007f) +0x000001a5: 00 DW_LNE_set_address (0x0000000000000081) 0x000001ac: 03 DW_LNS_advance_line (40) 0x000001ae: 05 DW_LNS_set_column (4) 0x000001b0: 06 DW_LNS_negate_stmt 0x000001b1: 01 DW_LNS_copy - 0x000000000000007f 40 4 1 0 0 is_stmt + 0x0000000000000081 40 4 1 0 0 is_stmt -0x000001b2: 00 DW_LNE_set_address (0x0000000000000087) +0x000001b2: 00 DW_LNE_set_address (0x0000000000000089) 0x000001b9: 05 DW_LNS_set_column (17) 0x000001bb: 06 DW_LNS_negate_stmt 0x000001bc: 01 DW_LNS_copy - 0x0000000000000087 40 17 1 0 0 + 0x0000000000000089 40 17 1 0 0 0x000001bd: 00 DW_LNE_set_address (0x0000000000000090) -0x000001c4: 03 DW_LNS_advance_line (44) -0x000001c6: 05 DW_LNS_set_column (16) +0x000001c4: 03 DW_LNS_advance_line (37) +0x000001c6: 05 DW_LNS_set_column (18) 0x000001c8: 06 DW_LNS_negate_stmt 0x000001c9: 01 DW_LNS_copy - 0x0000000000000090 44 16 1 0 0 is_stmt + 0x0000000000000090 37 18 1 0 0 is_stmt -0x000001ca: 00 DW_LNE_set_address (0x0000000000000099) -0x000001d1: 03 DW_LNS_advance_line (45) -0x000001d3: 05 DW_LNS_set_column (10) +0x000001ca: 00 DW_LNE_set_address (0x0000000000000095) +0x000001d1: 03 DW_LNS_advance_line (43) +0x000001d3: 05 DW_LNS_set_column (4) 0x000001d5: 01 DW_LNS_copy - 0x0000000000000099 45 10 1 0 0 is_stmt + 0x0000000000000095 43 4 1 0 0 is_stmt -0x000001d6: 00 DW_LNE_set_address (0x000000000000009b) -0x000001dd: 05 DW_LNS_set_column (18) -0x000001df: 06 DW_LNS_negate_stmt -0x000001e0: 01 DW_LNS_copy - 0x000000000000009b 45 18 1 0 0 +0x000001d6: 00 DW_LNE_set_address (0x0000000000000099) +0x000001dd: 03 DW_LNS_advance_line (44) +0x000001df: 05 DW_LNS_set_column (16) +0x000001e1: 01 DW_LNS_copy + 0x0000000000000099 44 16 1 0 0 is_stmt -0x000001e1: 00 DW_LNE_set_address (0x00000000000000a4) -0x000001e8: 05 DW_LNS_set_column (10) -0x000001ea: 01 DW_LNS_copy - 0x00000000000000a4 45 10 1 0 0 +0x000001e2: 00 DW_LNE_set_address (0x00000000000000a2) +0x000001e9: 03 DW_LNS_advance_line (45) +0x000001eb: 05 DW_LNS_set_column (10) +0x000001ed: 01 DW_LNS_copy + 0x00000000000000a2 45 10 1 0 0 is_stmt -0x000001eb: 00 DW_LNE_set_address (0x00000000000000a6) -0x000001f2: 05 DW_LNS_set_column (23) -0x000001f4: 01 DW_LNS_copy - 0x00000000000000a6 45 23 1 0 0 +0x000001ee: 00 DW_LNE_set_address (0x00000000000000a4) +0x000001f5: 05 DW_LNS_set_column (18) +0x000001f7: 06 DW_LNS_negate_stmt +0x000001f8: 01 DW_LNS_copy + 0x00000000000000a4 45 18 1 0 0 -0x000001f5: 00 DW_LNE_set_address (0x00000000000000ab) -0x000001fc: 03 DW_LNS_advance_line (44) -0x000001fe: 05 DW_LNS_set_column (16) -0x00000200: 06 DW_LNS_negate_stmt -0x00000201: 01 DW_LNS_copy - 0x00000000000000ab 44 16 1 0 0 is_stmt +0x000001f9: 00 DW_LNE_set_address (0x00000000000000ad) +0x00000200: 05 DW_LNS_set_column (10) +0x00000202: 01 DW_LNS_copy + 0x00000000000000ad 45 10 1 0 0 -0x00000202: 00 DW_LNE_set_address (0x00000000000000b8) -0x00000209: 03 DW_LNS_advance_line (46) -0x0000020b: 05 DW_LNS_set_column (11) -0x0000020d: 01 DW_LNS_copy - 0x00000000000000b8 46 11 1 0 0 is_stmt +0x00000203: 00 DW_LNE_set_address (0x00000000000000af) +0x0000020a: 05 DW_LNS_set_column (23) +0x0000020c: 01 DW_LNS_copy + 0x00000000000000af 45 23 1 0 0 -0x0000020e: 00 DW_LNE_set_address (0x00000000000000c4) -0x00000215: 05 DW_LNS_set_column (28) -0x00000217: 06 DW_LNS_negate_stmt -0x00000218: 01 DW_LNS_copy - 0x00000000000000c4 46 28 1 0 0 +0x0000020d: 00 DW_LNE_set_address (0x00000000000000b4) +0x00000214: 03 DW_LNS_advance_line (44) +0x00000216: 05 DW_LNS_set_column (16) +0x00000218: 06 DW_LNS_negate_stmt +0x00000219: 01 DW_LNS_copy + 0x00000000000000b4 44 16 1 0 0 is_stmt -0x00000219: 00 DW_LNE_set_address (0x00000000000000c9) -0x00000220: 05 DW_LNS_set_column (41) -0x00000222: 01 DW_LNS_copy - 0x00000000000000c9 46 41 1 0 0 +0x0000021a: 00 DW_LNE_set_address (0x00000000000000c1) +0x00000221: 03 DW_LNS_advance_line (46) +0x00000223: 05 DW_LNS_set_column (11) +0x00000225: 01 DW_LNS_copy + 0x00000000000000c1 46 11 1 0 0 is_stmt -0x00000223: 00 DW_LNE_set_address (0x00000000000000ce) -0x0000022a: 03 DW_LNS_advance_line (48) -0x0000022c: 05 DW_LNS_set_column (21) -0x0000022e: 06 DW_LNS_negate_stmt -0x0000022f: 01 DW_LNS_copy - 0x00000000000000ce 48 21 1 0 0 is_stmt +0x00000226: 00 DW_LNE_set_address (0x00000000000000cd) +0x0000022d: 05 DW_LNS_set_column (28) +0x0000022f: 06 DW_LNS_negate_stmt +0x00000230: 01 DW_LNS_copy + 0x00000000000000cd 46 28 1 0 0 -0x00000230: 00 DW_LNE_set_address (0x00000000000000d6) -0x00000237: 03 DW_LNS_advance_line (50) -0x00000239: 05 DW_LNS_set_column (14) -0x0000023b: 01 DW_LNS_copy - 0x00000000000000d6 50 14 1 0 0 is_stmt +0x00000231: 00 DW_LNE_set_address (0x00000000000000d2) +0x00000238: 05 DW_LNS_set_column (41) +0x0000023a: 01 DW_LNS_copy + 0x00000000000000d2 46 41 1 0 0 -0x0000023c: 00 DW_LNE_set_address (0x00000000000000e7) -0x00000243: 03 DW_LNS_advance_line (52) -0x00000245: 05 DW_LNS_set_column (38) +0x0000023b: 00 DW_LNE_set_address (0x00000000000000d7) +0x00000242: 03 DW_LNS_advance_line (48) +0x00000244: 05 DW_LNS_set_column (21) +0x00000246: 06 DW_LNS_negate_stmt 0x00000247: 01 DW_LNS_copy - 0x00000000000000e7 52 38 1 0 0 is_stmt + 0x00000000000000d7 48 21 1 0 0 is_stmt -0x00000248: 00 DW_LNE_set_address (0x00000000000000fb) -0x0000024f: 03 DW_LNS_advance_line (53) -0x00000251: 05 DW_LNS_set_column (22) +0x00000248: 00 DW_LNE_set_address (0x00000000000000df) +0x0000024f: 03 DW_LNS_advance_line (50) +0x00000251: 05 DW_LNS_set_column (14) 0x00000253: 01 DW_LNS_copy - 0x00000000000000fb 53 22 1 0 0 is_stmt + 0x00000000000000df 50 14 1 0 0 is_stmt -0x00000254: 00 DW_LNE_set_address (0x000000000000010a) -0x0000025b: 03 DW_LNS_advance_line (54) -0x0000025d: 05 DW_LNS_set_column (24) +0x00000254: 00 DW_LNE_set_address (0x00000000000000f0) +0x0000025b: 03 DW_LNS_advance_line (52) +0x0000025d: 05 DW_LNS_set_column (38) 0x0000025f: 01 DW_LNS_copy - 0x000000000000010a 54 24 1 0 0 is_stmt + 0x00000000000000f0 52 38 1 0 0 is_stmt -0x00000260: 00 DW_LNE_set_address (0x000000000000010c) -0x00000267: 05 DW_LNS_set_column (26) -0x00000269: 06 DW_LNS_negate_stmt -0x0000026a: 01 DW_LNS_copy - 0x000000000000010c 54 26 1 0 0 +0x00000260: 00 DW_LNE_set_address (0x0000000000000104) +0x00000267: 03 DW_LNS_advance_line (53) +0x00000269: 05 DW_LNS_set_column (22) +0x0000026b: 01 DW_LNS_copy + 0x0000000000000104 53 22 1 0 0 is_stmt -0x0000026b: 00 DW_LNE_set_address (0x0000000000000119) -0x00000272: 05 DW_LNS_set_column (24) -0x00000274: 01 DW_LNS_copy - 0x0000000000000119 54 24 1 0 0 +0x0000026c: 00 DW_LNE_set_address (0x0000000000000113) +0x00000273: 03 DW_LNS_advance_line (54) +0x00000275: 05 DW_LNS_set_column (24) +0x00000277: 01 DW_LNS_copy + 0x0000000000000113 54 24 1 0 0 is_stmt -0x00000275: 00 DW_LNE_set_address (0x000000000000011c) -0x0000027c: 03 DW_LNS_advance_line (55) -0x0000027e: 06 DW_LNS_negate_stmt -0x0000027f: 01 DW_LNS_copy - 0x000000000000011c 55 24 1 0 0 is_stmt +0x00000278: 00 DW_LNE_set_address (0x0000000000000115) +0x0000027f: 05 DW_LNS_set_column (26) +0x00000281: 06 DW_LNS_negate_stmt +0x00000282: 01 DW_LNS_copy + 0x0000000000000115 54 26 1 0 0 -0x00000280: 00 DW_LNE_set_address (0x0000000000000123) -0x00000287: 03 DW_LNS_advance_line (52) -0x00000289: 05 DW_LNS_set_column (44) -0x0000028b: 01 DW_LNS_copy - 0x0000000000000123 52 44 1 0 0 is_stmt +0x00000283: 00 DW_LNE_set_address (0x0000000000000122) +0x0000028a: 05 DW_LNS_set_column (24) +0x0000028c: 01 DW_LNS_copy + 0x0000000000000122 54 24 1 0 0 -0x0000028c: 00 DW_LNE_set_address (0x000000000000012f) -0x00000293: 05 DW_LNS_set_column (38) -0x00000295: 06 DW_LNS_negate_stmt -0x00000296: 01 DW_LNS_copy - 0x000000000000012f 52 38 1 0 0 +0x0000028d: 00 DW_LNE_set_address (0x0000000000000125) +0x00000294: 03 DW_LNS_advance_line (55) +0x00000296: 06 DW_LNS_negate_stmt +0x00000297: 01 DW_LNS_copy + 0x0000000000000125 55 24 1 0 0 is_stmt -0x00000297: 00 DW_LNE_set_address (0x0000000000000132) -0x0000029e: 05 DW_LNS_set_column (13) -0x000002a0: 01 DW_LNS_copy - 0x0000000000000132 52 13 1 0 0 +0x00000298: 00 DW_LNE_set_address (0x000000000000012c) +0x0000029f: 03 DW_LNS_advance_line (52) +0x000002a1: 05 DW_LNS_set_column (44) +0x000002a3: 01 DW_LNS_copy + 0x000000000000012c 52 44 1 0 0 is_stmt -0x000002a1: 00 DW_LNE_set_address (0x0000000000000136) -0x000002a8: 03 DW_LNS_advance_line (58) -0x000002aa: 05 DW_LNS_set_column (19) -0x000002ac: 06 DW_LNS_negate_stmt -0x000002ad: 01 DW_LNS_copy - 0x0000000000000136 58 19 1 0 0 is_stmt +0x000002a4: 00 DW_LNE_set_address (0x0000000000000138) +0x000002ab: 05 DW_LNS_set_column (38) +0x000002ad: 06 DW_LNS_negate_stmt +0x000002ae: 01 DW_LNS_copy + 0x0000000000000138 52 38 1 0 0 -0x000002ae: 00 DW_LNE_set_address (0x0000000000000145) -0x000002b5: 03 DW_LNS_advance_line (59) -0x000002b7: 05 DW_LNS_set_column (21) -0x000002b9: 01 DW_LNS_copy - 0x0000000000000145 59 21 1 0 0 is_stmt +0x000002af: 00 DW_LNE_set_address (0x000000000000013b) +0x000002b6: 05 DW_LNS_set_column (13) +0x000002b8: 01 DW_LNS_copy + 0x000000000000013b 52 13 1 0 0 -0x000002ba: 00 DW_LNE_set_address (0x000000000000014c) -0x000002c1: 03 DW_LNS_advance_line (57) -0x000002c3: 05 DW_LNS_set_column (18) +0x000002b9: 00 DW_LNE_set_address (0x000000000000013f) +0x000002c0: 03 DW_LNS_advance_line (58) +0x000002c2: 05 DW_LNS_set_column (19) +0x000002c4: 06 DW_LNS_negate_stmt 0x000002c5: 01 DW_LNS_copy - 0x000000000000014c 57 18 1 0 0 is_stmt + 0x000000000000013f 58 19 1 0 0 is_stmt -0x000002c6: 00 DW_LNE_set_address (0x000000000000015c) -0x000002cd: 03 DW_LNS_advance_line (62) -0x000002cf: 05 DW_LNS_set_column (14) +0x000002c6: 00 DW_LNE_set_address (0x000000000000014e) +0x000002cd: 03 DW_LNS_advance_line (59) +0x000002cf: 05 DW_LNS_set_column (21) 0x000002d1: 01 DW_LNS_copy - 0x000000000000015c 62 14 1 0 0 is_stmt + 0x000000000000014e 59 21 1 0 0 is_stmt -0x000002d2: 00 DW_LNE_set_address (0x0000000000000160) -0x000002d9: 05 DW_LNS_set_column (23) -0x000002db: 06 DW_LNS_negate_stmt -0x000002dc: 01 DW_LNS_copy - 0x0000000000000160 62 23 1 0 0 +0x000002d2: 00 DW_LNE_set_address (0x0000000000000155) +0x000002d9: 03 DW_LNS_advance_line (57) +0x000002db: 05 DW_LNS_set_column (18) +0x000002dd: 01 DW_LNS_copy + 0x0000000000000155 57 18 1 0 0 is_stmt -0x000002dd: 00 DW_LNE_set_address (0x0000000000000165) -0x000002e4: 05 DW_LNS_set_column (14) -0x000002e6: 01 DW_LNS_copy - 0x0000000000000165 62 14 1 0 0 +0x000002de: 00 DW_LNE_set_address (0x0000000000000165) +0x000002e5: 03 DW_LNS_advance_line (62) +0x000002e7: 05 DW_LNS_set_column (14) +0x000002e9: 01 DW_LNS_copy + 0x0000000000000165 62 14 1 0 0 is_stmt -0x000002e7: 00 DW_LNE_set_address (0x0000000000000169) -0x000002ee: 03 DW_LNS_advance_line (66) -0x000002f0: 05 DW_LNS_set_column (16) -0x000002f2: 06 DW_LNS_negate_stmt -0x000002f3: 01 DW_LNS_copy - 0x0000000000000169 66 16 1 0 0 is_stmt +0x000002ea: 00 DW_LNE_set_address (0x0000000000000169) +0x000002f1: 05 DW_LNS_set_column (23) +0x000002f3: 06 DW_LNS_negate_stmt +0x000002f4: 01 DW_LNS_copy + 0x0000000000000169 62 23 1 0 0 -0x000002f4: 00 DW_LNE_set_address (0x0000000000000176) -0x000002fb: 03 DW_LNS_advance_line (75) -0x000002fd: 05 DW_LNS_set_column (27) -0x000002ff: 01 DW_LNS_copy - 0x0000000000000176 75 27 1 0 0 is_stmt +0x000002f5: 00 DW_LNE_set_address (0x000000000000016e) +0x000002fc: 05 DW_LNS_set_column (14) +0x000002fe: 01 DW_LNS_copy + 0x000000000000016e 62 14 1 0 0 -0x00000300: 00 DW_LNE_set_address (0x000000000000017f) -0x00000307: 03 DW_LNS_advance_line (76) -0x00000309: 05 DW_LNS_set_column (16) +0x000002ff: 00 DW_LNE_set_address (0x0000000000000172) +0x00000306: 03 DW_LNS_advance_line (66) +0x00000308: 05 DW_LNS_set_column (16) +0x0000030a: 06 DW_LNS_negate_stmt 0x0000030b: 01 DW_LNS_copy - 0x000000000000017f 76 16 1 0 0 is_stmt + 0x0000000000000172 66 16 1 0 0 is_stmt -0x0000030c: 00 DW_LNE_set_address (0x0000000000000187) -0x00000313: 05 DW_LNS_set_column (27) -0x00000315: 06 DW_LNS_negate_stmt -0x00000316: 01 DW_LNS_copy - 0x0000000000000187 76 27 1 0 0 +0x0000030c: 00 DW_LNE_set_address (0x000000000000017f) +0x00000313: 03 DW_LNS_advance_line (75) +0x00000315: 05 DW_LNS_set_column (27) +0x00000317: 01 DW_LNS_copy + 0x000000000000017f 75 27 1 0 0 is_stmt -0x00000317: 00 DW_LNE_set_address (0x0000000000000189) -0x0000031e: 05 DW_LNS_set_column (35) -0x00000320: 01 DW_LNS_copy - 0x0000000000000189 76 35 1 0 0 +0x00000318: 00 DW_LNE_set_address (0x0000000000000188) +0x0000031f: 03 DW_LNS_advance_line (76) +0x00000321: 05 DW_LNS_set_column (16) +0x00000323: 01 DW_LNS_copy + 0x0000000000000188 76 16 1 0 0 is_stmt -0x00000321: 00 DW_LNE_set_address (0x0000000000000192) -0x00000328: 05 DW_LNS_set_column (27) -0x0000032a: 01 DW_LNS_copy - 0x0000000000000192 76 27 1 0 0 +0x00000324: 00 DW_LNE_set_address (0x0000000000000190) +0x0000032b: 05 DW_LNS_set_column (27) +0x0000032d: 06 DW_LNS_negate_stmt +0x0000032e: 01 DW_LNS_copy + 0x0000000000000190 76 27 1 0 0 -0x0000032b: 00 DW_LNE_set_address (0x0000000000000197) -0x00000332: 05 DW_LNS_set_column (25) -0x00000334: 01 DW_LNS_copy - 0x0000000000000197 76 25 1 0 0 +0x0000032f: 00 DW_LNE_set_address (0x0000000000000192) +0x00000336: 05 DW_LNS_set_column (35) +0x00000338: 01 DW_LNS_copy + 0x0000000000000192 76 35 1 0 0 -0x00000335: 00 DW_LNE_set_address (0x000000000000019a) -0x0000033c: 03 DW_LNS_advance_line (75) -0x0000033e: 05 DW_LNS_set_column (27) -0x00000340: 06 DW_LNS_negate_stmt -0x00000341: 01 DW_LNS_copy - 0x000000000000019a 75 27 1 0 0 is_stmt +0x00000339: 00 DW_LNE_set_address (0x000000000000019b) +0x00000340: 05 DW_LNS_set_column (27) +0x00000342: 01 DW_LNS_copy + 0x000000000000019b 76 27 1 0 0 -0x00000342: 00 DW_LNE_set_address (0x000000000000019f) -0x00000349: 05 DW_LNS_set_column (13) -0x0000034b: 06 DW_LNS_negate_stmt +0x00000343: 00 DW_LNE_set_address (0x00000000000001a0) +0x0000034a: 05 DW_LNS_set_column (25) 0x0000034c: 01 DW_LNS_copy - 0x000000000000019f 75 13 1 0 0 + 0x00000000000001a0 76 25 1 0 0 -0x0000034d: 00 DW_LNE_set_address (0x00000000000001a7) -0x00000354: 03 DW_LNS_advance_line (77) -0x00000356: 06 DW_LNS_negate_stmt -0x00000357: 01 DW_LNS_copy - 0x00000000000001a7 77 13 1 0 0 is_stmt +0x0000034d: 00 DW_LNE_set_address (0x00000000000001a3) +0x00000354: 03 DW_LNS_advance_line (75) +0x00000356: 05 DW_LNS_set_column (27) +0x00000358: 06 DW_LNS_negate_stmt +0x00000359: 01 DW_LNS_copy + 0x00000000000001a3 75 27 1 0 0 is_stmt -0x00000358: 00 DW_LNE_set_address (0x00000000000001af) -0x0000035f: 05 DW_LNS_set_column (22) -0x00000361: 06 DW_LNS_negate_stmt -0x00000362: 01 DW_LNS_copy - 0x00000000000001af 77 22 1 0 0 +0x0000035a: 00 DW_LNE_set_address (0x00000000000001a8) +0x00000361: 05 DW_LNS_set_column (13) +0x00000363: 06 DW_LNS_negate_stmt +0x00000364: 01 DW_LNS_copy + 0x00000000000001a8 75 13 1 0 0 -0x00000363: 00 DW_LNE_set_address (0x00000000000001b4) -0x0000036a: 03 DW_LNS_advance_line (79) -0x0000036c: 05 DW_LNS_set_column (16) +0x00000365: 00 DW_LNE_set_address (0x00000000000001b0) +0x0000036c: 03 DW_LNS_advance_line (77) 0x0000036e: 06 DW_LNS_negate_stmt 0x0000036f: 01 DW_LNS_copy - 0x00000000000001b4 79 16 1 0 0 is_stmt + 0x00000000000001b0 77 13 1 0 0 is_stmt -0x00000370: 00 DW_LNE_set_address (0x00000000000001bc) -0x00000377: 05 DW_LNS_set_column (14) +0x00000370: 00 DW_LNE_set_address (0x00000000000001b8) +0x00000377: 05 DW_LNS_set_column (22) 0x00000379: 06 DW_LNS_negate_stmt 0x0000037a: 01 DW_LNS_copy - 0x00000000000001bc 79 14 1 0 0 + 0x00000000000001b8 77 22 1 0 0 -0x0000037b: 00 DW_LNE_set_address (0x00000000000001cb) -0x00000382: 05 DW_LNS_set_column (25) -0x00000384: 01 DW_LNS_copy - 0x00000000000001cb 79 25 1 0 0 +0x0000037b: 00 DW_LNE_set_address (0x00000000000001bd) +0x00000382: 03 DW_LNS_advance_line (79) +0x00000384: 05 DW_LNS_set_column (16) +0x00000386: 06 DW_LNS_negate_stmt +0x00000387: 01 DW_LNS_copy + 0x00000000000001bd 79 16 1 0 0 is_stmt -0x00000385: 00 DW_LNE_set_address (0x00000000000001d2) -0x0000038c: 03 DW_LNS_advance_line (81) -0x0000038e: 05 DW_LNS_set_column (11) -0x00000390: 06 DW_LNS_negate_stmt -0x00000391: 01 DW_LNS_copy - 0x00000000000001d2 81 11 1 0 0 is_stmt +0x00000388: 00 DW_LNE_set_address (0x00000000000001c5) +0x0000038f: 05 DW_LNS_set_column (14) +0x00000391: 06 DW_LNS_negate_stmt +0x00000392: 01 DW_LNS_copy + 0x00000000000001c5 79 14 1 0 0 -0x00000392: 00 DW_LNE_set_address (0x00000000000001d7) -0x00000399: 03 DW_LNS_advance_line (66) -0x0000039b: 05 DW_LNS_set_column (16) -0x0000039d: 01 DW_LNS_copy - 0x00000000000001d7 66 16 1 0 0 is_stmt +0x00000393: 00 DW_LNE_set_address (0x00000000000001d4) +0x0000039a: 05 DW_LNS_set_column (25) +0x0000039c: 01 DW_LNS_copy + 0x00000000000001d4 79 25 1 0 0 -0x0000039e: 00 DW_LNE_set_address (0x00000000000001de) -0x000003a5: 03 DW_LNS_advance_line (74) -0x000003a7: 05 DW_LNS_set_column (22) +0x0000039d: 00 DW_LNE_set_address (0x00000000000001db) +0x000003a4: 03 DW_LNS_advance_line (81) +0x000003a6: 05 DW_LNS_set_column (11) +0x000003a8: 06 DW_LNS_negate_stmt 0x000003a9: 01 DW_LNS_copy - 0x00000000000001de 74 22 1 0 0 is_stmt + 0x00000000000001db 81 11 1 0 0 is_stmt -0x000003aa: 00 DW_LNE_set_address (0x00000000000001e7) -0x000003b1: 03 DW_LNS_advance_line (37) -0x000003b3: 05 DW_LNS_set_column (4) +0x000003aa: 00 DW_LNE_set_address (0x00000000000001e0) +0x000003b1: 03 DW_LNS_advance_line (66) +0x000003b3: 05 DW_LNS_set_column (16) 0x000003b5: 01 DW_LNS_copy - 0x00000000000001e7 37 4 1 0 0 is_stmt + 0x00000000000001e0 66 16 1 0 0 is_stmt -0x000003b6: 00 DW_LNE_set_address (0x00000000000001ec) -0x000003bd: 03 DW_LNS_advance_line (39) -0x000003bf: 01 DW_LNS_copy - 0x00000000000001ec 39 4 1 0 0 is_stmt +0x000003b6: 00 DW_LNE_set_address (0x00000000000001e7) +0x000003bd: 03 DW_LNS_advance_line (74) +0x000003bf: 05 DW_LNS_set_column (22) +0x000003c1: 01 DW_LNS_copy + 0x00000000000001e7 74 22 1 0 0 is_stmt -0x000003c0: 00 DW_LNE_set_address (0x00000000000001ee) -0x000003c7: 05 DW_LNS_set_column (16) -0x000003c9: 06 DW_LNS_negate_stmt -0x000003ca: 01 DW_LNS_copy - 0x00000000000001ee 39 16 1 0 0 +0x000003c2: 00 DW_LNE_set_address (0x00000000000001f0) +0x000003c9: 03 DW_LNS_advance_line (37) +0x000003cb: 05 DW_LNS_set_column (4) +0x000003cd: 01 DW_LNS_copy + 0x00000000000001f0 37 4 1 0 0 is_stmt -0x000003cb: 00 DW_LNE_set_address (0x00000000000001f7) -0x000003d2: 05 DW_LNS_set_column (4) -0x000003d4: 01 DW_LNS_copy - 0x00000000000001f7 39 4 1 0 0 +0x000003ce: 00 DW_LNE_set_address (0x00000000000001f5) +0x000003d5: 03 DW_LNS_advance_line (39) +0x000003d7: 01 DW_LNS_copy + 0x00000000000001f5 39 4 1 0 0 is_stmt -0x000003d5: 00 DW_LNE_set_address (0x00000000000001f9) -0x000003dc: 05 DW_LNS_set_column (23) -0x000003de: 01 DW_LNS_copy - 0x00000000000001f9 39 23 1 0 0 +0x000003d8: 00 DW_LNE_set_address (0x00000000000001f7) +0x000003df: 05 DW_LNS_set_column (16) +0x000003e1: 06 DW_LNS_negate_stmt +0x000003e2: 01 DW_LNS_copy + 0x00000000000001f7 39 16 1 0 0 -0x000003df: 00 DW_LNE_set_address (0x00000000000001fe) -0x000003e6: 05 DW_LNS_set_column (19) -0x000003e8: 01 DW_LNS_copy - 0x00000000000001fe 39 19 1 0 0 +0x000003e3: 00 DW_LNE_set_address (0x0000000000000200) +0x000003ea: 05 DW_LNS_set_column (4) +0x000003ec: 01 DW_LNS_copy + 0x0000000000000200 39 4 1 0 0 -0x000003e9: 00 DW_LNE_set_address (0x0000000000000203) -0x000003f0: 03 DW_LNS_advance_line (40) -0x000003f2: 05 DW_LNS_set_column (4) -0x000003f4: 06 DW_LNS_negate_stmt -0x000003f5: 01 DW_LNS_copy - 0x0000000000000203 40 4 1 0 0 is_stmt +0x000003ed: 00 DW_LNE_set_address (0x0000000000000202) +0x000003f4: 05 DW_LNS_set_column (23) +0x000003f6: 01 DW_LNS_copy + 0x0000000000000202 39 23 1 0 0 -0x000003f6: 00 DW_LNE_set_address (0x000000000000020b) -0x000003fd: 05 DW_LNS_set_column (17) -0x000003ff: 06 DW_LNS_negate_stmt +0x000003f7: 00 DW_LNE_set_address (0x0000000000000207) +0x000003fe: 05 DW_LNS_set_column (19) 0x00000400: 01 DW_LNS_copy - 0x000000000000020b 40 17 1 0 0 + 0x0000000000000207 39 19 1 0 0 -0x00000401: 00 DW_LNE_set_address (0x0000000000000214) -0x00000408: 03 DW_LNS_advance_line (44) -0x0000040a: 05 DW_LNS_set_column (16) +0x00000401: 00 DW_LNE_set_address (0x000000000000020c) +0x00000408: 03 DW_LNS_advance_line (40) +0x0000040a: 05 DW_LNS_set_column (4) 0x0000040c: 06 DW_LNS_negate_stmt 0x0000040d: 01 DW_LNS_copy - 0x0000000000000214 44 16 1 0 0 is_stmt + 0x000000000000020c 40 4 1 0 0 is_stmt -0x0000040e: 00 DW_LNE_set_address (0x000000000000021d) -0x00000415: 03 DW_LNS_advance_line (45) -0x00000417: 05 DW_LNS_set_column (10) -0x00000419: 01 DW_LNS_copy - 0x000000000000021d 45 10 1 0 0 is_stmt +0x0000040e: 00 DW_LNE_set_address (0x0000000000000214) +0x00000415: 05 DW_LNS_set_column (17) +0x00000417: 06 DW_LNS_negate_stmt +0x00000418: 01 DW_LNS_copy + 0x0000000000000214 40 17 1 0 0 -0x0000041a: 00 DW_LNE_set_address (0x000000000000021f) -0x00000421: 05 DW_LNS_set_column (18) -0x00000423: 06 DW_LNS_negate_stmt -0x00000424: 01 DW_LNS_copy - 0x000000000000021f 45 18 1 0 0 +0x00000419: 00 DW_LNE_set_address (0x000000000000021e) +0x00000420: 03 DW_LNS_advance_line (44) +0x00000422: 05 DW_LNS_set_column (16) +0x00000424: 06 DW_LNS_negate_stmt +0x00000425: 01 DW_LNS_copy + 0x000000000000021e 44 16 1 0 0 is_stmt -0x00000425: 00 DW_LNE_set_address (0x0000000000000228) -0x0000042c: 05 DW_LNS_set_column (10) -0x0000042e: 01 DW_LNS_copy - 0x0000000000000228 45 10 1 0 0 +0x00000426: 00 DW_LNE_set_address (0x0000000000000227) +0x0000042d: 03 DW_LNS_advance_line (45) +0x0000042f: 05 DW_LNS_set_column (10) +0x00000431: 01 DW_LNS_copy + 0x0000000000000227 45 10 1 0 0 is_stmt -0x0000042f: 00 DW_LNE_set_address (0x000000000000022a) -0x00000436: 05 DW_LNS_set_column (23) -0x00000438: 01 DW_LNS_copy - 0x000000000000022a 45 23 1 0 0 +0x00000432: 00 DW_LNE_set_address (0x0000000000000229) +0x00000439: 05 DW_LNS_set_column (18) +0x0000043b: 06 DW_LNS_negate_stmt +0x0000043c: 01 DW_LNS_copy + 0x0000000000000229 45 18 1 0 0 -0x00000439: 00 DW_LNE_set_address (0x000000000000022f) -0x00000440: 03 DW_LNS_advance_line (44) -0x00000442: 05 DW_LNS_set_column (16) -0x00000444: 06 DW_LNS_negate_stmt -0x00000445: 01 DW_LNS_copy - 0x000000000000022f 44 16 1 0 0 is_stmt +0x0000043d: 00 DW_LNE_set_address (0x0000000000000232) +0x00000444: 05 DW_LNS_set_column (10) +0x00000446: 01 DW_LNS_copy + 0x0000000000000232 45 10 1 0 0 -0x00000446: 00 DW_LNE_set_address (0x000000000000023c) -0x0000044d: 03 DW_LNS_advance_line (46) -0x0000044f: 05 DW_LNS_set_column (11) -0x00000451: 01 DW_LNS_copy - 0x000000000000023c 46 11 1 0 0 is_stmt +0x00000447: 00 DW_LNE_set_address (0x0000000000000234) +0x0000044e: 05 DW_LNS_set_column (23) +0x00000450: 01 DW_LNS_copy + 0x0000000000000234 45 23 1 0 0 -0x00000452: 00 DW_LNE_set_address (0x0000000000000248) -0x00000459: 05 DW_LNS_set_column (28) -0x0000045b: 06 DW_LNS_negate_stmt -0x0000045c: 01 DW_LNS_copy - 0x0000000000000248 46 28 1 0 0 +0x00000451: 00 DW_LNE_set_address (0x0000000000000239) +0x00000458: 03 DW_LNS_advance_line (44) +0x0000045a: 05 DW_LNS_set_column (16) +0x0000045c: 06 DW_LNS_negate_stmt +0x0000045d: 01 DW_LNS_copy + 0x0000000000000239 44 16 1 0 0 is_stmt -0x0000045d: 00 DW_LNE_set_address (0x000000000000024d) -0x00000464: 05 DW_LNS_set_column (41) -0x00000466: 01 DW_LNS_copy - 0x000000000000024d 46 41 1 0 0 +0x0000045e: 00 DW_LNE_set_address (0x0000000000000246) +0x00000465: 03 DW_LNS_advance_line (46) +0x00000467: 05 DW_LNS_set_column (11) +0x00000469: 01 DW_LNS_copy + 0x0000000000000246 46 11 1 0 0 is_stmt -0x00000467: 00 DW_LNE_set_address (0x0000000000000252) -0x0000046e: 03 DW_LNS_advance_line (50) -0x00000470: 05 DW_LNS_set_column (14) -0x00000472: 06 DW_LNS_negate_stmt -0x00000473: 01 DW_LNS_copy - 0x0000000000000252 50 14 1 0 0 is_stmt +0x0000046a: 00 DW_LNE_set_address (0x0000000000000252) +0x00000471: 05 DW_LNS_set_column (28) +0x00000473: 06 DW_LNS_negate_stmt +0x00000474: 01 DW_LNS_copy + 0x0000000000000252 46 28 1 0 0 -0x00000474: 00 DW_LNE_set_address (0x0000000000000263) -0x0000047b: 03 DW_LNS_advance_line (52) -0x0000047d: 05 DW_LNS_set_column (38) -0x0000047f: 01 DW_LNS_copy - 0x0000000000000263 52 38 1 0 0 is_stmt +0x00000475: 00 DW_LNE_set_address (0x0000000000000257) +0x0000047c: 05 DW_LNS_set_column (41) +0x0000047e: 01 DW_LNS_copy + 0x0000000000000257 46 41 1 0 0 -0x00000480: 00 DW_LNE_set_address (0x0000000000000277) -0x00000487: 03 DW_LNS_advance_line (53) -0x00000489: 05 DW_LNS_set_column (22) +0x0000047f: 00 DW_LNE_set_address (0x000000000000025c) +0x00000486: 03 DW_LNS_advance_line (50) +0x00000488: 05 DW_LNS_set_column (14) +0x0000048a: 06 DW_LNS_negate_stmt 0x0000048b: 01 DW_LNS_copy - 0x0000000000000277 53 22 1 0 0 is_stmt + 0x000000000000025c 50 14 1 0 0 is_stmt -0x0000048c: 00 DW_LNE_set_address (0x0000000000000286) -0x00000493: 03 DW_LNS_advance_line (54) -0x00000495: 05 DW_LNS_set_column (24) +0x0000048c: 00 DW_LNE_set_address (0x000000000000026d) +0x00000493: 03 DW_LNS_advance_line (52) +0x00000495: 05 DW_LNS_set_column (38) 0x00000497: 01 DW_LNS_copy - 0x0000000000000286 54 24 1 0 0 is_stmt + 0x000000000000026d 52 38 1 0 0 is_stmt -0x00000498: 00 DW_LNE_set_address (0x0000000000000288) -0x0000049f: 05 DW_LNS_set_column (26) -0x000004a1: 06 DW_LNS_negate_stmt -0x000004a2: 01 DW_LNS_copy - 0x0000000000000288 54 26 1 0 0 +0x00000498: 00 DW_LNE_set_address (0x0000000000000281) +0x0000049f: 03 DW_LNS_advance_line (53) +0x000004a1: 05 DW_LNS_set_column (22) +0x000004a3: 01 DW_LNS_copy + 0x0000000000000281 53 22 1 0 0 is_stmt -0x000004a3: 00 DW_LNE_set_address (0x0000000000000295) -0x000004aa: 05 DW_LNS_set_column (24) -0x000004ac: 01 DW_LNS_copy - 0x0000000000000295 54 24 1 0 0 +0x000004a4: 00 DW_LNE_set_address (0x0000000000000290) +0x000004ab: 03 DW_LNS_advance_line (54) +0x000004ad: 05 DW_LNS_set_column (24) +0x000004af: 01 DW_LNS_copy + 0x0000000000000290 54 24 1 0 0 is_stmt -0x000004ad: 00 DW_LNE_set_address (0x0000000000000298) -0x000004b4: 03 DW_LNS_advance_line (55) -0x000004b6: 06 DW_LNS_negate_stmt -0x000004b7: 01 DW_LNS_copy - 0x0000000000000298 55 24 1 0 0 is_stmt +0x000004b0: 00 DW_LNE_set_address (0x0000000000000292) +0x000004b7: 05 DW_LNS_set_column (26) +0x000004b9: 06 DW_LNS_negate_stmt +0x000004ba: 01 DW_LNS_copy + 0x0000000000000292 54 26 1 0 0 -0x000004b8: 00 DW_LNE_set_address (0x000000000000029f) -0x000004bf: 03 DW_LNS_advance_line (52) -0x000004c1: 05 DW_LNS_set_column (44) -0x000004c3: 01 DW_LNS_copy - 0x000000000000029f 52 44 1 0 0 is_stmt +0x000004bb: 00 DW_LNE_set_address (0x000000000000029f) +0x000004c2: 05 DW_LNS_set_column (24) +0x000004c4: 01 DW_LNS_copy + 0x000000000000029f 54 24 1 0 0 -0x000004c4: 00 DW_LNE_set_address (0x00000000000002ab) -0x000004cb: 05 DW_LNS_set_column (38) -0x000004cd: 06 DW_LNS_negate_stmt -0x000004ce: 01 DW_LNS_copy - 0x00000000000002ab 52 38 1 0 0 +0x000004c5: 00 DW_LNE_set_address (0x00000000000002a2) +0x000004cc: 03 DW_LNS_advance_line (55) +0x000004ce: 06 DW_LNS_negate_stmt +0x000004cf: 01 DW_LNS_copy + 0x00000000000002a2 55 24 1 0 0 is_stmt -0x000004cf: 00 DW_LNE_set_address (0x00000000000002b2) -0x000004d6: 03 DW_LNS_advance_line (58) -0x000004d8: 05 DW_LNS_set_column (19) -0x000004da: 06 DW_LNS_negate_stmt +0x000004d0: 00 DW_LNE_set_address (0x00000000000002a9) +0x000004d7: 03 DW_LNS_advance_line (52) +0x000004d9: 05 DW_LNS_set_column (44) 0x000004db: 01 DW_LNS_copy - 0x00000000000002b2 58 19 1 0 0 is_stmt + 0x00000000000002a9 52 44 1 0 0 is_stmt -0x000004dc: 00 DW_LNE_set_address (0x00000000000002c1) -0x000004e3: 03 DW_LNS_advance_line (59) -0x000004e5: 05 DW_LNS_set_column (21) -0x000004e7: 01 DW_LNS_copy - 0x00000000000002c1 59 21 1 0 0 is_stmt +0x000004dc: 00 DW_LNE_set_address (0x00000000000002b5) +0x000004e3: 05 DW_LNS_set_column (38) +0x000004e5: 06 DW_LNS_negate_stmt +0x000004e6: 01 DW_LNS_copy + 0x00000000000002b5 52 38 1 0 0 -0x000004e8: 00 DW_LNE_set_address (0x00000000000002c8) -0x000004ef: 03 DW_LNS_advance_line (57) -0x000004f1: 05 DW_LNS_set_column (18) +0x000004e7: 00 DW_LNE_set_address (0x00000000000002bc) +0x000004ee: 03 DW_LNS_advance_line (58) +0x000004f0: 05 DW_LNS_set_column (19) +0x000004f2: 06 DW_LNS_negate_stmt 0x000004f3: 01 DW_LNS_copy - 0x00000000000002c8 57 18 1 0 0 is_stmt + 0x00000000000002bc 58 19 1 0 0 is_stmt -0x000004f4: 00 DW_LNE_set_address (0x00000000000002d8) -0x000004fb: 03 DW_LNS_advance_line (62) -0x000004fd: 05 DW_LNS_set_column (14) +0x000004f4: 00 DW_LNE_set_address (0x00000000000002cb) +0x000004fb: 03 DW_LNS_advance_line (59) +0x000004fd: 05 DW_LNS_set_column (21) 0x000004ff: 01 DW_LNS_copy - 0x00000000000002d8 62 14 1 0 0 is_stmt + 0x00000000000002cb 59 21 1 0 0 is_stmt -0x00000500: 00 DW_LNE_set_address (0x00000000000002dc) -0x00000507: 05 DW_LNS_set_column (23) -0x00000509: 06 DW_LNS_negate_stmt -0x0000050a: 01 DW_LNS_copy - 0x00000000000002dc 62 23 1 0 0 +0x00000500: 00 DW_LNE_set_address (0x00000000000002d2) +0x00000507: 03 DW_LNS_advance_line (57) +0x00000509: 05 DW_LNS_set_column (18) +0x0000050b: 01 DW_LNS_copy + 0x00000000000002d2 57 18 1 0 0 is_stmt -0x0000050b: 00 DW_LNE_set_address (0x00000000000002e1) -0x00000512: 05 DW_LNS_set_column (14) -0x00000514: 01 DW_LNS_copy - 0x00000000000002e1 62 14 1 0 0 +0x0000050c: 00 DW_LNE_set_address (0x00000000000002e2) +0x00000513: 03 DW_LNS_advance_line (62) +0x00000515: 05 DW_LNS_set_column (14) +0x00000517: 01 DW_LNS_copy + 0x00000000000002e2 62 14 1 0 0 is_stmt -0x00000515: 00 DW_LNE_set_address (0x00000000000002e5) -0x0000051c: 03 DW_LNS_advance_line (66) -0x0000051e: 05 DW_LNS_set_column (16) -0x00000520: 06 DW_LNS_negate_stmt -0x00000521: 01 DW_LNS_copy - 0x00000000000002e5 66 16 1 0 0 is_stmt +0x00000518: 00 DW_LNE_set_address (0x00000000000002e6) +0x0000051f: 05 DW_LNS_set_column (23) +0x00000521: 06 DW_LNS_negate_stmt +0x00000522: 01 DW_LNS_copy + 0x00000000000002e6 62 23 1 0 0 -0x00000522: 00 DW_LNE_set_address (0x00000000000002f2) -0x00000529: 03 DW_LNS_advance_line (75) -0x0000052b: 05 DW_LNS_set_column (27) -0x0000052d: 01 DW_LNS_copy - 0x00000000000002f2 75 27 1 0 0 is_stmt +0x00000523: 00 DW_LNE_set_address (0x00000000000002eb) +0x0000052a: 05 DW_LNS_set_column (14) +0x0000052c: 01 DW_LNS_copy + 0x00000000000002eb 62 14 1 0 0 -0x0000052e: 00 DW_LNE_set_address (0x00000000000002fb) -0x00000535: 03 DW_LNS_advance_line (76) -0x00000537: 05 DW_LNS_set_column (16) +0x0000052d: 00 DW_LNE_set_address (0x00000000000002ef) +0x00000534: 03 DW_LNS_advance_line (66) +0x00000536: 05 DW_LNS_set_column (16) +0x00000538: 06 DW_LNS_negate_stmt 0x00000539: 01 DW_LNS_copy - 0x00000000000002fb 76 16 1 0 0 is_stmt + 0x00000000000002ef 66 16 1 0 0 is_stmt -0x0000053a: 00 DW_LNE_set_address (0x0000000000000303) -0x00000541: 05 DW_LNS_set_column (27) -0x00000543: 06 DW_LNS_negate_stmt -0x00000544: 01 DW_LNS_copy - 0x0000000000000303 76 27 1 0 0 +0x0000053a: 00 DW_LNE_set_address (0x00000000000002fc) +0x00000541: 03 DW_LNS_advance_line (75) +0x00000543: 05 DW_LNS_set_column (27) +0x00000545: 01 DW_LNS_copy + 0x00000000000002fc 75 27 1 0 0 is_stmt -0x00000545: 00 DW_LNE_set_address (0x0000000000000305) -0x0000054c: 05 DW_LNS_set_column (35) -0x0000054e: 01 DW_LNS_copy - 0x0000000000000305 76 35 1 0 0 +0x00000546: 00 DW_LNE_set_address (0x0000000000000305) +0x0000054d: 03 DW_LNS_advance_line (76) +0x0000054f: 05 DW_LNS_set_column (16) +0x00000551: 01 DW_LNS_copy + 0x0000000000000305 76 16 1 0 0 is_stmt -0x0000054f: 00 DW_LNE_set_address (0x000000000000030e) -0x00000556: 05 DW_LNS_set_column (27) -0x00000558: 01 DW_LNS_copy - 0x000000000000030e 76 27 1 0 0 +0x00000552: 00 DW_LNE_set_address (0x000000000000030d) +0x00000559: 05 DW_LNS_set_column (27) +0x0000055b: 06 DW_LNS_negate_stmt +0x0000055c: 01 DW_LNS_copy + 0x000000000000030d 76 27 1 0 0 -0x00000559: 00 DW_LNE_set_address (0x0000000000000313) -0x00000560: 05 DW_LNS_set_column (25) -0x00000562: 01 DW_LNS_copy - 0x0000000000000313 76 25 1 0 0 +0x0000055d: 00 DW_LNE_set_address (0x000000000000030f) +0x00000564: 05 DW_LNS_set_column (35) +0x00000566: 01 DW_LNS_copy + 0x000000000000030f 76 35 1 0 0 -0x00000563: 00 DW_LNE_set_address (0x0000000000000316) -0x0000056a: 03 DW_LNS_advance_line (75) -0x0000056c: 05 DW_LNS_set_column (27) -0x0000056e: 06 DW_LNS_negate_stmt -0x0000056f: 01 DW_LNS_copy - 0x0000000000000316 75 27 1 0 0 is_stmt +0x00000567: 00 DW_LNE_set_address (0x0000000000000318) +0x0000056e: 05 DW_LNS_set_column (27) +0x00000570: 01 DW_LNS_copy + 0x0000000000000318 76 27 1 0 0 -0x00000570: 00 DW_LNE_set_address (0x0000000000000323) -0x00000577: 03 DW_LNS_advance_line (77) -0x00000579: 05 DW_LNS_set_column (13) -0x0000057b: 01 DW_LNS_copy - 0x0000000000000323 77 13 1 0 0 is_stmt +0x00000571: 00 DW_LNE_set_address (0x000000000000031d) +0x00000578: 05 DW_LNS_set_column (25) +0x0000057a: 01 DW_LNS_copy + 0x000000000000031d 76 25 1 0 0 -0x0000057c: 00 DW_LNE_set_address (0x000000000000032b) -0x00000583: 05 DW_LNS_set_column (22) -0x00000585: 06 DW_LNS_negate_stmt -0x00000586: 01 DW_LNS_copy - 0x000000000000032b 77 22 1 0 0 +0x0000057b: 00 DW_LNE_set_address (0x0000000000000320) +0x00000582: 03 DW_LNS_advance_line (75) +0x00000584: 05 DW_LNS_set_column (27) +0x00000586: 06 DW_LNS_negate_stmt +0x00000587: 01 DW_LNS_copy + 0x0000000000000320 75 27 1 0 0 is_stmt -0x00000587: 00 DW_LNE_set_address (0x0000000000000330) -0x0000058e: 03 DW_LNS_advance_line (79) -0x00000590: 05 DW_LNS_set_column (16) -0x00000592: 06 DW_LNS_negate_stmt +0x00000588: 00 DW_LNE_set_address (0x000000000000032d) +0x0000058f: 03 DW_LNS_advance_line (77) +0x00000591: 05 DW_LNS_set_column (13) 0x00000593: 01 DW_LNS_copy - 0x0000000000000330 79 16 1 0 0 is_stmt + 0x000000000000032d 77 13 1 0 0 is_stmt -0x00000594: 00 DW_LNE_set_address (0x0000000000000338) -0x0000059b: 05 DW_LNS_set_column (14) +0x00000594: 00 DW_LNE_set_address (0x0000000000000335) +0x0000059b: 05 DW_LNS_set_column (22) 0x0000059d: 06 DW_LNS_negate_stmt 0x0000059e: 01 DW_LNS_copy - 0x0000000000000338 79 14 1 0 0 + 0x0000000000000335 77 22 1 0 0 -0x0000059f: 00 DW_LNE_set_address (0x0000000000000347) -0x000005a6: 05 DW_LNS_set_column (25) -0x000005a8: 01 DW_LNS_copy - 0x0000000000000347 79 25 1 0 0 +0x0000059f: 00 DW_LNE_set_address (0x000000000000033a) +0x000005a6: 03 DW_LNS_advance_line (79) +0x000005a8: 05 DW_LNS_set_column (16) +0x000005aa: 06 DW_LNS_negate_stmt +0x000005ab: 01 DW_LNS_copy + 0x000000000000033a 79 16 1 0 0 is_stmt -0x000005a9: 00 DW_LNE_set_address (0x000000000000034e) -0x000005b0: 03 DW_LNS_advance_line (81) -0x000005b2: 05 DW_LNS_set_column (11) -0x000005b4: 06 DW_LNS_negate_stmt -0x000005b5: 01 DW_LNS_copy - 0x000000000000034e 81 11 1 0 0 is_stmt +0x000005ac: 00 DW_LNE_set_address (0x0000000000000342) +0x000005b3: 05 DW_LNS_set_column (14) +0x000005b5: 06 DW_LNS_negate_stmt +0x000005b6: 01 DW_LNS_copy + 0x0000000000000342 79 14 1 0 0 -0x000005b6: 00 DW_LNE_set_address (0x0000000000000353) -0x000005bd: 03 DW_LNS_advance_line (66) -0x000005bf: 05 DW_LNS_set_column (16) -0x000005c1: 01 DW_LNS_copy - 0x0000000000000353 66 16 1 0 0 is_stmt +0x000005b7: 00 DW_LNE_set_address (0x0000000000000351) +0x000005be: 05 DW_LNS_set_column (25) +0x000005c0: 01 DW_LNS_copy + 0x0000000000000351 79 25 1 0 0 -0x000005c2: 00 DW_LNE_set_address (0x000000000000035a) -0x000005c9: 03 DW_LNS_advance_line (74) -0x000005cb: 05 DW_LNS_set_column (22) +0x000005c1: 00 DW_LNE_set_address (0x0000000000000358) +0x000005c8: 03 DW_LNS_advance_line (81) +0x000005ca: 05 DW_LNS_set_column (11) +0x000005cc: 06 DW_LNS_negate_stmt 0x000005cd: 01 DW_LNS_copy - 0x000000000000035a 74 22 1 0 0 is_stmt + 0x0000000000000358 81 11 1 0 0 is_stmt -0x000005ce: 00 DW_LNE_set_address (0x0000000000000368) -0x000005d5: 03 DW_LNS_advance_line (67) -0x000005d7: 05 DW_LNS_set_column (13) +0x000005ce: 00 DW_LNE_set_address (0x000000000000035d) +0x000005d5: 03 DW_LNS_advance_line (66) +0x000005d7: 05 DW_LNS_set_column (16) 0x000005d9: 01 DW_LNS_copy - 0x0000000000000368 67 13 1 0 0 is_stmt + 0x000000000000035d 66 16 1 0 0 is_stmt -0x000005da: 00 DW_LNE_set_address (0x000000000000036c) -0x000005e1: 03 DW_LNS_advance_line (68) -0x000005e3: 01 DW_LNS_copy - 0x000000000000036c 68 13 1 0 0 is_stmt +0x000005da: 00 DW_LNE_set_address (0x0000000000000364) +0x000005e1: 03 DW_LNS_advance_line (74) +0x000005e3: 05 DW_LNS_set_column (22) +0x000005e5: 01 DW_LNS_copy + 0x0000000000000364 74 22 1 0 0 is_stmt -0x000005e4: 00 DW_LNE_set_address (0x0000000000000370) -0x000005eb: 03 DW_LNS_advance_line (69) -0x000005ed: 01 DW_LNS_copy - 0x0000000000000370 69 13 1 0 0 is_stmt +0x000005e6: 00 DW_LNE_set_address (0x0000000000000372) +0x000005ed: 03 DW_LNS_advance_line (67) +0x000005ef: 05 DW_LNS_set_column (13) +0x000005f1: 01 DW_LNS_copy + 0x0000000000000372 67 13 1 0 0 is_stmt -0x000005ee: 00 DW_LNE_set_address (0x0000000000000374) -0x000005f5: 03 DW_LNS_advance_line (70) -0x000005f7: 01 DW_LNS_copy - 0x0000000000000374 70 13 1 0 0 is_stmt +0x000005f2: 00 DW_LNE_set_address (0x0000000000000376) +0x000005f9: 03 DW_LNS_advance_line (68) +0x000005fb: 01 DW_LNS_copy + 0x0000000000000376 68 13 1 0 0 is_stmt -0x000005f8: 00 DW_LNE_set_address (0x0000000000000377) -0x000005ff: 00 DW_LNE_end_sequence - 0x0000000000000377 70 13 1 0 0 is_stmt end_sequence +0x000005fc: 00 DW_LNE_set_address (0x000000000000037a) +0x00000603: 03 DW_LNS_advance_line (69) +0x00000605: 01 DW_LNS_copy + 0x000000000000037a 69 13 1 0 0 is_stmt -0x00000602: 00 DW_LNE_set_address (0x0000000000000379) -0x00000609: 03 DW_LNS_advance_line (152) -0x0000060c: 01 DW_LNS_copy - 0x0000000000000379 152 0 1 0 0 is_stmt +0x00000606: 00 DW_LNE_set_address (0x000000000000037e) +0x0000060d: 03 DW_LNS_advance_line (70) +0x0000060f: 01 DW_LNS_copy + 0x000000000000037e 70 13 1 0 0 is_stmt -0x0000060d: 00 DW_LNE_set_address (0x0000000000000395) -0x00000614: 03 DW_LNS_advance_line (153) -0x00000616: 05 DW_LNS_set_column (17) -0x00000618: 0a DW_LNS_set_prologue_end -0x00000619: 01 DW_LNS_copy - 0x0000000000000395 153 17 1 0 0 is_stmt prologue_end +0x00000610: 00 DW_LNE_set_address (0x0000000000000381) +0x00000617: 00 DW_LNE_end_sequence + 0x0000000000000381 70 13 1 0 0 is_stmt end_sequence -0x0000061a: 00 DW_LNE_set_address (0x000000000000039c) -0x00000621: 05 DW_LNS_set_column (28) -0x00000623: 06 DW_LNS_negate_stmt +0x0000061a: 00 DW_LNE_set_address (0x0000000000000383) +0x00000621: 03 DW_LNS_advance_line (152) 0x00000624: 01 DW_LNS_copy - 0x000000000000039c 153 28 1 0 0 + 0x0000000000000383 152 0 1 0 0 is_stmt -0x00000625: 00 DW_LNE_set_address (0x00000000000003a1) -0x0000062c: 05 DW_LNS_set_column (23) -0x0000062e: 01 DW_LNS_copy - 0x00000000000003a1 153 23 1 0 0 +0x00000625: 00 DW_LNE_set_address (0x000000000000039f) +0x0000062c: 03 DW_LNS_advance_line (153) +0x0000062e: 05 DW_LNS_set_column (17) +0x00000630: 0a DW_LNS_set_prologue_end +0x00000631: 01 DW_LNS_copy + 0x000000000000039f 153 17 1 0 0 is_stmt prologue_end -0x0000062f: 00 DW_LNE_set_address (0x00000000000003a7) -0x00000636: 03 DW_LNS_advance_line (155) -0x00000638: 05 DW_LNS_set_column (10) -0x0000063a: 06 DW_LNS_negate_stmt -0x0000063b: 01 DW_LNS_copy - 0x00000000000003a7 155 10 1 0 0 is_stmt +0x00000632: 00 DW_LNE_set_address (0x00000000000003a6) +0x00000639: 05 DW_LNS_set_column (28) +0x0000063b: 06 DW_LNS_negate_stmt +0x0000063c: 01 DW_LNS_copy + 0x00000000000003a6 153 28 1 0 0 -0x0000063c: 00 DW_LNE_set_address (0x00000000000003a8) -0x00000643: 05 DW_LNS_set_column (8) -0x00000645: 06 DW_LNS_negate_stmt +0x0000063d: 00 DW_LNE_set_address (0x00000000000003ab) +0x00000644: 05 DW_LNS_set_column (23) 0x00000646: 01 DW_LNS_copy - 0x00000000000003a8 155 8 1 0 0 + 0x00000000000003ab 153 23 1 0 0 -0x00000647: 00 DW_LNE_set_address (0x00000000000003ab) -0x0000064e: 03 DW_LNS_advance_line (156) -0x00000650: 05 DW_LNS_set_column (7) +0x00000647: 00 DW_LNE_set_address (0x00000000000003b1) +0x0000064e: 03 DW_LNS_advance_line (155) +0x00000650: 05 DW_LNS_set_column (10) 0x00000652: 06 DW_LNS_negate_stmt 0x00000653: 01 DW_LNS_copy - 0x00000000000003ab 156 7 1 0 0 is_stmt + 0x00000000000003b1 155 10 1 0 0 is_stmt -0x00000654: 00 DW_LNE_set_address (0x00000000000003b8) -0x0000065b: 03 DW_LNS_advance_line (94) -0x0000065d: 05 DW_LNS_set_column (18) -0x0000065f: 01 DW_LNS_copy - 0x00000000000003b8 94 18 1 0 0 is_stmt +0x00000654: 00 DW_LNE_set_address (0x00000000000003b2) +0x0000065b: 05 DW_LNS_set_column (8) +0x0000065d: 06 DW_LNS_negate_stmt +0x0000065e: 01 DW_LNS_copy + 0x00000000000003b2 155 8 1 0 0 -0x00000660: 00 DW_LNE_set_address (0x00000000000003d2) -0x00000667: 03 DW_LNS_advance_line (95) -0x00000669: 05 DW_LNS_set_column (29) +0x0000065f: 00 DW_LNE_set_address (0x00000000000003b5) +0x00000666: 03 DW_LNS_advance_line (156) +0x00000668: 05 DW_LNS_set_column (7) +0x0000066a: 06 DW_LNS_negate_stmt 0x0000066b: 01 DW_LNS_copy - 0x00000000000003d2 95 29 1 0 0 is_stmt + 0x00000000000003b5 156 7 1 0 0 is_stmt -0x0000066c: 00 DW_LNE_set_address (0x00000000000003d4) -0x00000673: 03 DW_LNS_advance_line (98) -0x00000675: 05 DW_LNS_set_column (19) +0x0000066c: 00 DW_LNE_set_address (0x00000000000003c2) +0x00000673: 03 DW_LNS_advance_line (94) +0x00000675: 05 DW_LNS_set_column (18) 0x00000677: 01 DW_LNS_copy - 0x00000000000003d4 98 19 1 0 0 is_stmt + 0x00000000000003c2 94 18 1 0 0 is_stmt -0x00000678: 00 DW_LNE_set_address (0x00000000000003db) -0x0000067f: 03 DW_LNS_advance_line (97) -0x00000681: 05 DW_LNS_set_column (16) +0x00000678: 00 DW_LNE_set_address (0x00000000000003dc) +0x0000067f: 03 DW_LNS_advance_line (95) +0x00000681: 05 DW_LNS_set_column (29) 0x00000683: 01 DW_LNS_copy - 0x00000000000003db 97 16 1 0 0 is_stmt + 0x00000000000003dc 95 29 1 0 0 is_stmt -0x00000684: 00 DW_LNE_set_address (0x00000000000003e2) -0x0000068b: 03 DW_LNS_advance_line (96) -0x0000068d: 01 DW_LNS_copy - 0x00000000000003e2 96 16 1 0 0 is_stmt +0x00000684: 00 DW_LNE_set_address (0x00000000000003de) +0x0000068b: 03 DW_LNS_advance_line (98) +0x0000068d: 05 DW_LNS_set_column (19) +0x0000068f: 01 DW_LNS_copy + 0x00000000000003de 98 19 1 0 0 is_stmt -0x0000068e: 00 DW_LNE_set_address (0x00000000000003ed) -0x00000695: 03 DW_LNS_advance_line (94) -0x00000697: 05 DW_LNS_set_column (28) -0x00000699: 01 DW_LNS_copy - 0x00000000000003ed 94 28 1 0 0 is_stmt +0x00000690: 00 DW_LNE_set_address (0x00000000000003e5) +0x00000697: 03 DW_LNS_advance_line (97) +0x00000699: 05 DW_LNS_set_column (16) +0x0000069b: 01 DW_LNS_copy + 0x00000000000003e5 97 16 1 0 0 is_stmt -0x0000069a: 00 DW_LNE_set_address (0x00000000000003f2) -0x000006a1: 05 DW_LNS_set_column (18) -0x000006a3: 06 DW_LNS_negate_stmt -0x000006a4: 01 DW_LNS_copy - 0x00000000000003f2 94 18 1 0 0 +0x0000069c: 00 DW_LNE_set_address (0x00000000000003ec) +0x000006a3: 03 DW_LNS_advance_line (96) +0x000006a5: 01 DW_LNS_copy + 0x00000000000003ec 96 16 1 0 0 is_stmt -0x000006a5: 00 DW_LNE_set_address (0x00000000000003f7) -0x000006ac: 05 DW_LNS_set_column (4) -0x000006ae: 01 DW_LNS_copy - 0x00000000000003f7 94 4 1 0 0 +0x000006a6: 00 DW_LNE_set_address (0x00000000000003f7) +0x000006ad: 03 DW_LNS_advance_line (94) +0x000006af: 05 DW_LNS_set_column (28) +0x000006b1: 01 DW_LNS_copy + 0x00000000000003f7 94 28 1 0 0 is_stmt -0x000006af: 00 DW_LNE_set_address (0x00000000000003ff) -0x000006b6: 03 DW_LNS_advance_line (102) -0x000006b8: 05 DW_LNS_set_column (27) -0x000006ba: 06 DW_LNS_negate_stmt -0x000006bb: 01 DW_LNS_copy - 0x00000000000003ff 102 27 1 0 0 is_stmt +0x000006b2: 00 DW_LNE_set_address (0x00000000000003fc) +0x000006b9: 05 DW_LNS_set_column (18) +0x000006bb: 06 DW_LNS_negate_stmt +0x000006bc: 01 DW_LNS_copy + 0x00000000000003fc 94 18 1 0 0 -0x000006bc: 00 DW_LNE_set_address (0x0000000000000404) -0x000006c3: 05 DW_LNS_set_column (18) -0x000006c5: 06 DW_LNS_negate_stmt +0x000006bd: 00 DW_LNE_set_address (0x0000000000000401) +0x000006c4: 05 DW_LNS_set_column (4) 0x000006c6: 01 DW_LNS_copy - 0x0000000000000404 102 18 1 0 0 + 0x0000000000000401 94 4 1 0 0 -0x000006c7: 00 DW_LNE_set_address (0x000000000000040a) -0x000006ce: 03 DW_LNS_advance_line (103) -0x000006d0: 06 DW_LNS_negate_stmt -0x000006d1: 01 DW_LNS_copy - 0x000000000000040a 103 18 1 0 0 is_stmt +0x000006c7: 00 DW_LNE_set_address (0x0000000000000409) +0x000006ce: 03 DW_LNS_advance_line (102) +0x000006d0: 05 DW_LNS_set_column (27) +0x000006d2: 06 DW_LNS_negate_stmt +0x000006d3: 01 DW_LNS_copy + 0x0000000000000409 102 27 1 0 0 is_stmt -0x000006d2: 00 DW_LNE_set_address (0x0000000000000416) -0x000006d9: 03 DW_LNS_advance_line (105) -0x000006db: 01 DW_LNS_copy - 0x0000000000000416 105 18 1 0 0 is_stmt +0x000006d4: 00 DW_LNE_set_address (0x000000000000040e) +0x000006db: 05 DW_LNS_set_column (18) +0x000006dd: 06 DW_LNS_negate_stmt +0x000006de: 01 DW_LNS_copy + 0x000000000000040e 102 18 1 0 0 -0x000006dc: 00 DW_LNE_set_address (0x000000000000041f) -0x000006e3: 03 DW_LNS_advance_line (106) -0x000006e5: 05 DW_LNS_set_column (7) -0x000006e7: 01 DW_LNS_copy - 0x000000000000041f 106 7 1 0 0 is_stmt +0x000006df: 00 DW_LNE_set_address (0x0000000000000414) +0x000006e6: 03 DW_LNS_advance_line (103) +0x000006e8: 06 DW_LNS_negate_stmt +0x000006e9: 01 DW_LNS_copy + 0x0000000000000414 103 18 1 0 0 is_stmt -0x000006e8: 00 DW_LNE_set_address (0x0000000000000427) -0x000006ef: 05 DW_LNS_set_column (16) -0x000006f1: 06 DW_LNS_negate_stmt -0x000006f2: 01 DW_LNS_copy - 0x0000000000000427 106 16 1 0 0 +0x000006ea: 00 DW_LNE_set_address (0x0000000000000420) +0x000006f1: 03 DW_LNS_advance_line (105) +0x000006f3: 01 DW_LNS_copy + 0x0000000000000420 105 18 1 0 0 is_stmt -0x000006f3: 00 DW_LNE_set_address (0x000000000000042c) -0x000006fa: 03 DW_LNS_advance_line (105) -0x000006fc: 05 DW_LNS_set_column (24) -0x000006fe: 06 DW_LNS_negate_stmt +0x000006f4: 00 DW_LNE_set_address (0x0000000000000429) +0x000006fb: 03 DW_LNS_advance_line (106) +0x000006fd: 05 DW_LNS_set_column (7) 0x000006ff: 01 DW_LNS_copy - 0x000000000000042c 105 24 1 0 0 is_stmt + 0x0000000000000429 106 7 1 0 0 is_stmt 0x00000700: 00 DW_LNE_set_address (0x0000000000000431) -0x00000707: 05 DW_LNS_set_column (18) +0x00000707: 05 DW_LNS_set_column (16) 0x00000709: 06 DW_LNS_negate_stmt 0x0000070a: 01 DW_LNS_copy - 0x0000000000000431 105 18 1 0 0 + 0x0000000000000431 106 16 1 0 0 -0x0000070b: 00 DW_LNE_set_address (0x0000000000000457) -0x00000712: 03 DW_LNS_advance_line (112) -0x00000714: 05 DW_LNS_set_column (13) +0x0000070b: 00 DW_LNE_set_address (0x0000000000000436) +0x00000712: 03 DW_LNS_advance_line (105) +0x00000714: 05 DW_LNS_set_column (24) 0x00000716: 06 DW_LNS_negate_stmt 0x00000717: 01 DW_LNS_copy - 0x0000000000000457 112 13 1 0 0 is_stmt + 0x0000000000000436 105 24 1 0 0 is_stmt -0x00000718: 00 DW_LNE_set_address (0x0000000000000459) -0x0000071f: 05 DW_LNS_set_column (26) +0x00000718: 00 DW_LNE_set_address (0x000000000000043b) +0x0000071f: 05 DW_LNS_set_column (18) 0x00000721: 06 DW_LNS_negate_stmt 0x00000722: 01 DW_LNS_copy - 0x0000000000000459 112 26 1 0 0 + 0x000000000000043b 105 18 1 0 0 -0x00000723: 00 DW_LNE_set_address (0x0000000000000466) -0x0000072a: 05 DW_LNS_set_column (35) -0x0000072c: 01 DW_LNS_copy - 0x0000000000000466 112 35 1 0 0 +0x00000723: 00 DW_LNE_set_address (0x0000000000000461) +0x0000072a: 03 DW_LNS_advance_line (112) +0x0000072c: 05 DW_LNS_set_column (13) +0x0000072e: 06 DW_LNS_negate_stmt +0x0000072f: 01 DW_LNS_copy + 0x0000000000000461 112 13 1 0 0 is_stmt -0x0000072d: 00 DW_LNE_set_address (0x0000000000000467) -0x00000734: 05 DW_LNS_set_column (13) -0x00000736: 01 DW_LNS_copy - 0x0000000000000467 112 13 1 0 0 +0x00000730: 00 DW_LNE_set_address (0x0000000000000463) +0x00000737: 05 DW_LNS_set_column (26) +0x00000739: 06 DW_LNS_negate_stmt +0x0000073a: 01 DW_LNS_copy + 0x0000000000000463 112 26 1 0 0 -0x00000737: 00 DW_LNE_set_address (0x0000000000000475) -0x0000073e: 03 DW_LNS_advance_line (111) -0x00000740: 05 DW_LNS_set_column (30) -0x00000742: 06 DW_LNS_negate_stmt -0x00000743: 01 DW_LNS_copy - 0x0000000000000475 111 30 1 0 0 is_stmt +0x0000073b: 00 DW_LNE_set_address (0x0000000000000470) +0x00000742: 05 DW_LNS_set_column (35) +0x00000744: 01 DW_LNS_copy + 0x0000000000000470 112 35 1 0 0 -0x00000744: 00 DW_LNE_set_address (0x000000000000047a) -0x0000074b: 05 DW_LNS_set_column (24) -0x0000074d: 06 DW_LNS_negate_stmt +0x00000745: 00 DW_LNE_set_address (0x0000000000000471) +0x0000074c: 05 DW_LNS_set_column (13) 0x0000074e: 01 DW_LNS_copy - 0x000000000000047a 111 24 1 0 0 + 0x0000000000000471 112 13 1 0 0 0x0000074f: 00 DW_LNE_set_address (0x000000000000047f) -0x00000756: 05 DW_LNS_set_column (10) -0x00000758: 01 DW_LNS_copy - 0x000000000000047f 111 10 1 0 0 +0x00000756: 03 DW_LNS_advance_line (111) +0x00000758: 05 DW_LNS_set_column (30) +0x0000075a: 06 DW_LNS_negate_stmt +0x0000075b: 01 DW_LNS_copy + 0x000000000000047f 111 30 1 0 0 is_stmt -0x00000759: 00 DW_LNE_set_address (0x0000000000000484) -0x00000760: 03 DW_LNS_advance_line (113) -0x00000762: 06 DW_LNS_negate_stmt -0x00000763: 01 DW_LNS_copy - 0x0000000000000484 113 10 1 0 0 is_stmt +0x0000075c: 00 DW_LNE_set_address (0x0000000000000484) +0x00000763: 05 DW_LNS_set_column (24) +0x00000765: 06 DW_LNS_negate_stmt +0x00000766: 01 DW_LNS_copy + 0x0000000000000484 111 24 1 0 0 -0x00000764: 00 DW_LNE_set_address (0x0000000000000487) -0x0000076b: 03 DW_LNS_advance_line (118) -0x0000076d: 05 DW_LNS_set_column (16) -0x0000076f: 01 DW_LNS_copy - 0x0000000000000487 118 16 1 0 0 is_stmt +0x00000767: 00 DW_LNE_set_address (0x0000000000000489) +0x0000076e: 05 DW_LNS_set_column (10) +0x00000770: 01 DW_LNS_copy + 0x0000000000000489 111 10 1 0 0 -0x00000770: 00 DW_LNE_set_address (0x0000000000000490) -0x00000777: 03 DW_LNS_advance_line (119) -0x00000779: 05 DW_LNS_set_column (10) +0x00000771: 00 DW_LNE_set_address (0x000000000000048e) +0x00000778: 03 DW_LNS_advance_line (113) +0x0000077a: 06 DW_LNS_negate_stmt 0x0000077b: 01 DW_LNS_copy - 0x0000000000000490 119 10 1 0 0 is_stmt + 0x000000000000048e 113 10 1 0 0 is_stmt -0x0000077c: 00 DW_LNE_set_address (0x0000000000000492) -0x00000783: 05 DW_LNS_set_column (18) -0x00000785: 06 DW_LNS_negate_stmt -0x00000786: 01 DW_LNS_copy - 0x0000000000000492 119 18 1 0 0 +0x0000077c: 00 DW_LNE_set_address (0x0000000000000491) +0x00000783: 03 DW_LNS_advance_line (118) +0x00000785: 05 DW_LNS_set_column (16) +0x00000787: 01 DW_LNS_copy + 0x0000000000000491 118 16 1 0 0 is_stmt -0x00000787: 00 DW_LNE_set_address (0x000000000000049b) -0x0000078e: 05 DW_LNS_set_column (10) -0x00000790: 01 DW_LNS_copy - 0x000000000000049b 119 10 1 0 0 +0x00000788: 00 DW_LNE_set_address (0x000000000000049a) +0x0000078f: 03 DW_LNS_advance_line (119) +0x00000791: 05 DW_LNS_set_column (10) +0x00000793: 01 DW_LNS_copy + 0x000000000000049a 119 10 1 0 0 is_stmt -0x00000791: 00 DW_LNE_set_address (0x000000000000049d) -0x00000798: 05 DW_LNS_set_column (23) -0x0000079a: 01 DW_LNS_copy - 0x000000000000049d 119 23 1 0 0 +0x00000794: 00 DW_LNE_set_address (0x000000000000049c) +0x0000079b: 05 DW_LNS_set_column (18) +0x0000079d: 06 DW_LNS_negate_stmt +0x0000079e: 01 DW_LNS_copy + 0x000000000000049c 119 18 1 0 0 -0x0000079b: 00 DW_LNE_set_address (0x00000000000004a2) -0x000007a2: 03 DW_LNS_advance_line (118) -0x000007a4: 05 DW_LNS_set_column (16) -0x000007a6: 06 DW_LNS_negate_stmt -0x000007a7: 01 DW_LNS_copy - 0x00000000000004a2 118 16 1 0 0 is_stmt +0x0000079f: 00 DW_LNE_set_address (0x00000000000004a5) +0x000007a6: 05 DW_LNS_set_column (10) +0x000007a8: 01 DW_LNS_copy + 0x00000000000004a5 119 10 1 0 0 -0x000007a8: 00 DW_LNE_set_address (0x00000000000004af) -0x000007af: 03 DW_LNS_advance_line (122) -0x000007b1: 01 DW_LNS_copy - 0x00000000000004af 122 16 1 0 0 is_stmt +0x000007a9: 00 DW_LNE_set_address (0x00000000000004a7) +0x000007b0: 05 DW_LNS_set_column (23) +0x000007b2: 01 DW_LNS_copy + 0x00000000000004a7 119 23 1 0 0 -0x000007b2: 00 DW_LNE_set_address (0x00000000000004c3) -0x000007b9: 03 DW_LNS_advance_line (125) -0x000007bb: 05 DW_LNS_set_column (22) -0x000007bd: 01 DW_LNS_copy - 0x00000000000004c3 125 22 1 0 0 is_stmt +0x000007b3: 00 DW_LNE_set_address (0x00000000000004ac) +0x000007ba: 03 DW_LNS_advance_line (118) +0x000007bc: 05 DW_LNS_set_column (16) +0x000007be: 06 DW_LNS_negate_stmt +0x000007bf: 01 DW_LNS_copy + 0x00000000000004ac 118 16 1 0 0 is_stmt -0x000007be: 00 DW_LNE_set_address (0x00000000000004ca) -0x000007c5: 03 DW_LNS_advance_line (126) -0x000007c7: 05 DW_LNS_set_column (27) +0x000007c0: 00 DW_LNE_set_address (0x00000000000004b9) +0x000007c7: 03 DW_LNS_advance_line (122) 0x000007c9: 01 DW_LNS_copy - 0x00000000000004ca 126 27 1 0 0 is_stmt + 0x00000000000004b9 122 16 1 0 0 is_stmt -0x000007ca: 00 DW_LNE_set_address (0x00000000000004d3) -0x000007d1: 03 DW_LNS_advance_line (127) -0x000007d3: 05 DW_LNS_set_column (16) +0x000007ca: 00 DW_LNE_set_address (0x00000000000004cd) +0x000007d1: 03 DW_LNS_advance_line (125) +0x000007d3: 05 DW_LNS_set_column (22) 0x000007d5: 01 DW_LNS_copy - 0x00000000000004d3 127 16 1 0 0 is_stmt + 0x00000000000004cd 125 22 1 0 0 is_stmt -0x000007d6: 00 DW_LNE_set_address (0x00000000000004db) -0x000007dd: 05 DW_LNS_set_column (27) -0x000007df: 06 DW_LNS_negate_stmt -0x000007e0: 01 DW_LNS_copy - 0x00000000000004db 127 27 1 0 0 +0x000007d6: 00 DW_LNE_set_address (0x00000000000004d4) +0x000007dd: 03 DW_LNS_advance_line (126) +0x000007df: 05 DW_LNS_set_column (27) +0x000007e1: 01 DW_LNS_copy + 0x00000000000004d4 126 27 1 0 0 is_stmt -0x000007e1: 00 DW_LNE_set_address (0x00000000000004dd) -0x000007e8: 05 DW_LNS_set_column (35) -0x000007ea: 01 DW_LNS_copy - 0x00000000000004dd 127 35 1 0 0 +0x000007e2: 00 DW_LNE_set_address (0x00000000000004dd) +0x000007e9: 03 DW_LNS_advance_line (127) +0x000007eb: 05 DW_LNS_set_column (16) +0x000007ed: 01 DW_LNS_copy + 0x00000000000004dd 127 16 1 0 0 is_stmt -0x000007eb: 00 DW_LNE_set_address (0x00000000000004e6) -0x000007f2: 05 DW_LNS_set_column (27) -0x000007f4: 01 DW_LNS_copy - 0x00000000000004e6 127 27 1 0 0 +0x000007ee: 00 DW_LNE_set_address (0x00000000000004e5) +0x000007f5: 05 DW_LNS_set_column (27) +0x000007f7: 06 DW_LNS_negate_stmt +0x000007f8: 01 DW_LNS_copy + 0x00000000000004e5 127 27 1 0 0 -0x000007f5: 00 DW_LNE_set_address (0x00000000000004eb) -0x000007fc: 05 DW_LNS_set_column (25) -0x000007fe: 01 DW_LNS_copy - 0x00000000000004eb 127 25 1 0 0 +0x000007f9: 00 DW_LNE_set_address (0x00000000000004e7) +0x00000800: 05 DW_LNS_set_column (35) +0x00000802: 01 DW_LNS_copy + 0x00000000000004e7 127 35 1 0 0 -0x000007ff: 00 DW_LNE_set_address (0x00000000000004ee) -0x00000806: 03 DW_LNS_advance_line (126) -0x00000808: 05 DW_LNS_set_column (27) -0x0000080a: 06 DW_LNS_negate_stmt -0x0000080b: 01 DW_LNS_copy - 0x00000000000004ee 126 27 1 0 0 is_stmt +0x00000803: 00 DW_LNE_set_address (0x00000000000004f0) +0x0000080a: 05 DW_LNS_set_column (27) +0x0000080c: 01 DW_LNS_copy + 0x00000000000004f0 127 27 1 0 0 -0x0000080c: 00 DW_LNE_set_address (0x00000000000004f3) -0x00000813: 05 DW_LNS_set_column (13) -0x00000815: 06 DW_LNS_negate_stmt +0x0000080d: 00 DW_LNE_set_address (0x00000000000004f5) +0x00000814: 05 DW_LNS_set_column (25) 0x00000816: 01 DW_LNS_copy - 0x00000000000004f3 126 13 1 0 0 + 0x00000000000004f5 127 25 1 0 0 -0x00000817: 00 DW_LNE_set_address (0x00000000000004fb) -0x0000081e: 03 DW_LNS_advance_line (128) -0x00000820: 06 DW_LNS_negate_stmt -0x00000821: 01 DW_LNS_copy - 0x00000000000004fb 128 13 1 0 0 is_stmt +0x00000817: 00 DW_LNE_set_address (0x00000000000004f8) +0x0000081e: 03 DW_LNS_advance_line (126) +0x00000820: 05 DW_LNS_set_column (27) +0x00000822: 06 DW_LNS_negate_stmt +0x00000823: 01 DW_LNS_copy + 0x00000000000004f8 126 27 1 0 0 is_stmt -0x00000822: 00 DW_LNE_set_address (0x0000000000000503) -0x00000829: 05 DW_LNS_set_column (22) -0x0000082b: 06 DW_LNS_negate_stmt -0x0000082c: 01 DW_LNS_copy - 0x0000000000000503 128 22 1 0 0 +0x00000824: 00 DW_LNE_set_address (0x00000000000004fd) +0x0000082b: 05 DW_LNS_set_column (13) +0x0000082d: 06 DW_LNS_negate_stmt +0x0000082e: 01 DW_LNS_copy + 0x00000000000004fd 126 13 1 0 0 -0x0000082d: 00 DW_LNE_set_address (0x0000000000000508) -0x00000834: 03 DW_LNS_advance_line (130) -0x00000836: 05 DW_LNS_set_column (16) +0x0000082f: 00 DW_LNE_set_address (0x0000000000000505) +0x00000836: 03 DW_LNS_advance_line (128) 0x00000838: 06 DW_LNS_negate_stmt 0x00000839: 01 DW_LNS_copy - 0x0000000000000508 130 16 1 0 0 is_stmt + 0x0000000000000505 128 13 1 0 0 is_stmt -0x0000083a: 00 DW_LNE_set_address (0x0000000000000510) -0x00000841: 05 DW_LNS_set_column (14) +0x0000083a: 00 DW_LNE_set_address (0x000000000000050d) +0x00000841: 05 DW_LNS_set_column (22) 0x00000843: 06 DW_LNS_negate_stmt 0x00000844: 01 DW_LNS_copy - 0x0000000000000510 130 14 1 0 0 + 0x000000000000050d 128 22 1 0 0 -0x00000845: 00 DW_LNE_set_address (0x000000000000051f) -0x0000084c: 05 DW_LNS_set_column (25) -0x0000084e: 01 DW_LNS_copy - 0x000000000000051f 130 25 1 0 0 +0x00000845: 00 DW_LNE_set_address (0x0000000000000512) +0x0000084c: 03 DW_LNS_advance_line (130) +0x0000084e: 05 DW_LNS_set_column (16) +0x00000850: 06 DW_LNS_negate_stmt +0x00000851: 01 DW_LNS_copy + 0x0000000000000512 130 16 1 0 0 is_stmt -0x0000084f: 00 DW_LNE_set_address (0x0000000000000526) -0x00000856: 03 DW_LNS_advance_line (133) -0x00000858: 05 DW_LNS_set_column (11) -0x0000085a: 06 DW_LNS_negate_stmt -0x0000085b: 01 DW_LNS_copy - 0x0000000000000526 133 11 1 0 0 is_stmt +0x00000852: 00 DW_LNE_set_address (0x000000000000051a) +0x00000859: 05 DW_LNS_set_column (14) +0x0000085b: 06 DW_LNS_negate_stmt +0x0000085c: 01 DW_LNS_copy + 0x000000000000051a 130 14 1 0 0 -0x0000085c: 00 DW_LNE_set_address (0x000000000000052b) -0x00000863: 03 DW_LNS_advance_line (122) -0x00000865: 05 DW_LNS_set_column (16) -0x00000867: 01 DW_LNS_copy - 0x000000000000052b 122 16 1 0 0 is_stmt +0x0000085d: 00 DW_LNE_set_address (0x0000000000000529) +0x00000864: 05 DW_LNS_set_column (25) +0x00000866: 01 DW_LNS_copy + 0x0000000000000529 130 25 1 0 0 -0x00000868: 00 DW_LNE_set_address (0x0000000000000530) -0x0000086f: 05 DW_LNS_set_column (14) -0x00000871: 06 DW_LNS_negate_stmt -0x00000872: 01 DW_LNS_copy - 0x0000000000000530 122 14 1 0 0 +0x00000867: 00 DW_LNE_set_address (0x0000000000000530) +0x0000086e: 03 DW_LNS_advance_line (133) +0x00000870: 05 DW_LNS_set_column (11) +0x00000872: 06 DW_LNS_negate_stmt +0x00000873: 01 DW_LNS_copy + 0x0000000000000530 133 11 1 0 0 is_stmt -0x00000873: 00 DW_LNE_set_address (0x0000000000000536) -0x0000087a: 03 DW_LNS_advance_line (110) -0x0000087c: 05 DW_LNS_set_column (11) -0x0000087e: 06 DW_LNS_negate_stmt +0x00000874: 00 DW_LNE_set_address (0x0000000000000535) +0x0000087b: 03 DW_LNS_advance_line (122) +0x0000087d: 05 DW_LNS_set_column (16) 0x0000087f: 01 DW_LNS_copy - 0x0000000000000536 110 11 1 0 0 is_stmt + 0x0000000000000535 122 16 1 0 0 is_stmt -0x00000880: 00 DW_LNE_set_address (0x0000000000000542) -0x00000887: 03 DW_LNS_advance_line (113) -0x00000889: 05 DW_LNS_set_column (10) -0x0000088b: 01 DW_LNS_copy - 0x0000000000000542 113 10 1 0 0 is_stmt +0x00000880: 00 DW_LNE_set_address (0x000000000000053a) +0x00000887: 05 DW_LNS_set_column (14) +0x00000889: 06 DW_LNS_negate_stmt +0x0000088a: 01 DW_LNS_copy + 0x000000000000053a 122 14 1 0 0 -0x0000088c: 00 DW_LNE_set_address (0x0000000000000545) -0x00000893: 03 DW_LNS_advance_line (118) -0x00000895: 05 DW_LNS_set_column (16) +0x0000088b: 00 DW_LNE_set_address (0x0000000000000540) +0x00000892: 03 DW_LNS_advance_line (110) +0x00000894: 05 DW_LNS_set_column (11) +0x00000896: 06 DW_LNS_negate_stmt 0x00000897: 01 DW_LNS_copy - 0x0000000000000545 118 16 1 0 0 is_stmt + 0x0000000000000540 110 11 1 0 0 is_stmt -0x00000898: 00 DW_LNE_set_address (0x000000000000054e) -0x0000089f: 03 DW_LNS_advance_line (119) +0x00000898: 00 DW_LNE_set_address (0x000000000000054c) +0x0000089f: 03 DW_LNS_advance_line (113) 0x000008a1: 05 DW_LNS_set_column (10) 0x000008a3: 01 DW_LNS_copy - 0x000000000000054e 119 10 1 0 0 is_stmt + 0x000000000000054c 113 10 1 0 0 is_stmt -0x000008a4: 00 DW_LNE_set_address (0x0000000000000550) -0x000008ab: 05 DW_LNS_set_column (18) -0x000008ad: 06 DW_LNS_negate_stmt -0x000008ae: 01 DW_LNS_copy - 0x0000000000000550 119 18 1 0 0 +0x000008a4: 00 DW_LNE_set_address (0x000000000000054f) +0x000008ab: 03 DW_LNS_advance_line (118) +0x000008ad: 05 DW_LNS_set_column (16) +0x000008af: 01 DW_LNS_copy + 0x000000000000054f 118 16 1 0 0 is_stmt -0x000008af: 00 DW_LNE_set_address (0x0000000000000559) -0x000008b6: 05 DW_LNS_set_column (10) -0x000008b8: 01 DW_LNS_copy - 0x0000000000000559 119 10 1 0 0 +0x000008b0: 00 DW_LNE_set_address (0x0000000000000558) +0x000008b7: 03 DW_LNS_advance_line (119) +0x000008b9: 05 DW_LNS_set_column (10) +0x000008bb: 01 DW_LNS_copy + 0x0000000000000558 119 10 1 0 0 is_stmt -0x000008b9: 00 DW_LNE_set_address (0x000000000000055b) -0x000008c0: 05 DW_LNS_set_column (23) -0x000008c2: 01 DW_LNS_copy - 0x000000000000055b 119 23 1 0 0 +0x000008bc: 00 DW_LNE_set_address (0x000000000000055a) +0x000008c3: 05 DW_LNS_set_column (18) +0x000008c5: 06 DW_LNS_negate_stmt +0x000008c6: 01 DW_LNS_copy + 0x000000000000055a 119 18 1 0 0 -0x000008c3: 00 DW_LNE_set_address (0x0000000000000560) -0x000008ca: 03 DW_LNS_advance_line (118) -0x000008cc: 05 DW_LNS_set_column (16) -0x000008ce: 06 DW_LNS_negate_stmt -0x000008cf: 01 DW_LNS_copy - 0x0000000000000560 118 16 1 0 0 is_stmt +0x000008c7: 00 DW_LNE_set_address (0x0000000000000563) +0x000008ce: 05 DW_LNS_set_column (10) +0x000008d0: 01 DW_LNS_copy + 0x0000000000000563 119 10 1 0 0 -0x000008d0: 00 DW_LNE_set_address (0x000000000000056d) -0x000008d7: 03 DW_LNS_advance_line (122) -0x000008d9: 01 DW_LNS_copy - 0x000000000000056d 122 16 1 0 0 is_stmt +0x000008d1: 00 DW_LNE_set_address (0x0000000000000565) +0x000008d8: 05 DW_LNS_set_column (23) +0x000008da: 01 DW_LNS_copy + 0x0000000000000565 119 23 1 0 0 -0x000008da: 00 DW_LNE_set_address (0x0000000000000572) -0x000008e1: 05 DW_LNS_set_column (14) -0x000008e3: 06 DW_LNS_negate_stmt -0x000008e4: 01 DW_LNS_copy - 0x0000000000000572 122 14 1 0 0 +0x000008db: 00 DW_LNE_set_address (0x000000000000056a) +0x000008e2: 03 DW_LNS_advance_line (118) +0x000008e4: 05 DW_LNS_set_column (16) +0x000008e6: 06 DW_LNS_negate_stmt +0x000008e7: 01 DW_LNS_copy + 0x000000000000056a 118 16 1 0 0 is_stmt -0x000008e5: 00 DW_LNE_set_address (0x000000000000057b) -0x000008ec: 03 DW_LNS_advance_line (125) -0x000008ee: 05 DW_LNS_set_column (22) -0x000008f0: 06 DW_LNS_negate_stmt +0x000008e8: 00 DW_LNE_set_address (0x0000000000000577) +0x000008ef: 03 DW_LNS_advance_line (122) 0x000008f1: 01 DW_LNS_copy - 0x000000000000057b 125 22 1 0 0 is_stmt + 0x0000000000000577 122 16 1 0 0 is_stmt -0x000008f2: 00 DW_LNE_set_address (0x0000000000000588) -0x000008f9: 03 DW_LNS_advance_line (126) -0x000008fb: 05 DW_LNS_set_column (27) -0x000008fd: 01 DW_LNS_copy - 0x0000000000000588 126 27 1 0 0 is_stmt +0x000008f2: 00 DW_LNE_set_address (0x000000000000057c) +0x000008f9: 05 DW_LNS_set_column (14) +0x000008fb: 06 DW_LNS_negate_stmt +0x000008fc: 01 DW_LNS_copy + 0x000000000000057c 122 14 1 0 0 -0x000008fe: 00 DW_LNE_set_address (0x0000000000000591) -0x00000905: 03 DW_LNS_advance_line (127) -0x00000907: 05 DW_LNS_set_column (16) +0x000008fd: 00 DW_LNE_set_address (0x0000000000000585) +0x00000904: 03 DW_LNS_advance_line (125) +0x00000906: 05 DW_LNS_set_column (22) +0x00000908: 06 DW_LNS_negate_stmt 0x00000909: 01 DW_LNS_copy - 0x0000000000000591 127 16 1 0 0 is_stmt + 0x0000000000000585 125 22 1 0 0 is_stmt -0x0000090a: 00 DW_LNE_set_address (0x0000000000000599) -0x00000911: 05 DW_LNS_set_column (27) -0x00000913: 06 DW_LNS_negate_stmt -0x00000914: 01 DW_LNS_copy - 0x0000000000000599 127 27 1 0 0 +0x0000090a: 00 DW_LNE_set_address (0x0000000000000592) +0x00000911: 03 DW_LNS_advance_line (126) +0x00000913: 05 DW_LNS_set_column (27) +0x00000915: 01 DW_LNS_copy + 0x0000000000000592 126 27 1 0 0 is_stmt -0x00000915: 00 DW_LNE_set_address (0x000000000000059b) -0x0000091c: 05 DW_LNS_set_column (35) -0x0000091e: 01 DW_LNS_copy - 0x000000000000059b 127 35 1 0 0 +0x00000916: 00 DW_LNE_set_address (0x000000000000059b) +0x0000091d: 03 DW_LNS_advance_line (127) +0x0000091f: 05 DW_LNS_set_column (16) +0x00000921: 01 DW_LNS_copy + 0x000000000000059b 127 16 1 0 0 is_stmt -0x0000091f: 00 DW_LNE_set_address (0x00000000000005a4) -0x00000926: 05 DW_LNS_set_column (27) -0x00000928: 01 DW_LNS_copy - 0x00000000000005a4 127 27 1 0 0 +0x00000922: 00 DW_LNE_set_address (0x00000000000005a3) +0x00000929: 05 DW_LNS_set_column (27) +0x0000092b: 06 DW_LNS_negate_stmt +0x0000092c: 01 DW_LNS_copy + 0x00000000000005a3 127 27 1 0 0 -0x00000929: 00 DW_LNE_set_address (0x00000000000005a9) -0x00000930: 05 DW_LNS_set_column (25) -0x00000932: 01 DW_LNS_copy - 0x00000000000005a9 127 25 1 0 0 +0x0000092d: 00 DW_LNE_set_address (0x00000000000005a5) +0x00000934: 05 DW_LNS_set_column (35) +0x00000936: 01 DW_LNS_copy + 0x00000000000005a5 127 35 1 0 0 -0x00000933: 00 DW_LNE_set_address (0x00000000000005ac) -0x0000093a: 03 DW_LNS_advance_line (126) -0x0000093c: 05 DW_LNS_set_column (27) -0x0000093e: 06 DW_LNS_negate_stmt -0x0000093f: 01 DW_LNS_copy - 0x00000000000005ac 126 27 1 0 0 is_stmt +0x00000937: 00 DW_LNE_set_address (0x00000000000005ae) +0x0000093e: 05 DW_LNS_set_column (27) +0x00000940: 01 DW_LNS_copy + 0x00000000000005ae 127 27 1 0 0 -0x00000940: 00 DW_LNE_set_address (0x00000000000005b1) -0x00000947: 05 DW_LNS_set_column (13) -0x00000949: 06 DW_LNS_negate_stmt +0x00000941: 00 DW_LNE_set_address (0x00000000000005b3) +0x00000948: 05 DW_LNS_set_column (25) 0x0000094a: 01 DW_LNS_copy - 0x00000000000005b1 126 13 1 0 0 + 0x00000000000005b3 127 25 1 0 0 -0x0000094b: 00 DW_LNE_set_address (0x00000000000005b9) -0x00000952: 03 DW_LNS_advance_line (128) -0x00000954: 06 DW_LNS_negate_stmt -0x00000955: 01 DW_LNS_copy - 0x00000000000005b9 128 13 1 0 0 is_stmt +0x0000094b: 00 DW_LNE_set_address (0x00000000000005b6) +0x00000952: 03 DW_LNS_advance_line (126) +0x00000954: 05 DW_LNS_set_column (27) +0x00000956: 06 DW_LNS_negate_stmt +0x00000957: 01 DW_LNS_copy + 0x00000000000005b6 126 27 1 0 0 is_stmt -0x00000956: 00 DW_LNE_set_address (0x00000000000005c1) -0x0000095d: 05 DW_LNS_set_column (22) -0x0000095f: 06 DW_LNS_negate_stmt -0x00000960: 01 DW_LNS_copy - 0x00000000000005c1 128 22 1 0 0 +0x00000958: 00 DW_LNE_set_address (0x00000000000005bb) +0x0000095f: 05 DW_LNS_set_column (13) +0x00000961: 06 DW_LNS_negate_stmt +0x00000962: 01 DW_LNS_copy + 0x00000000000005bb 126 13 1 0 0 -0x00000961: 00 DW_LNE_set_address (0x00000000000005c6) -0x00000968: 03 DW_LNS_advance_line (130) -0x0000096a: 05 DW_LNS_set_column (16) +0x00000963: 00 DW_LNE_set_address (0x00000000000005c3) +0x0000096a: 03 DW_LNS_advance_line (128) 0x0000096c: 06 DW_LNS_negate_stmt 0x0000096d: 01 DW_LNS_copy - 0x00000000000005c6 130 16 1 0 0 is_stmt + 0x00000000000005c3 128 13 1 0 0 is_stmt -0x0000096e: 00 DW_LNE_set_address (0x00000000000005ce) -0x00000975: 05 DW_LNS_set_column (14) +0x0000096e: 00 DW_LNE_set_address (0x00000000000005cb) +0x00000975: 05 DW_LNS_set_column (22) 0x00000977: 06 DW_LNS_negate_stmt 0x00000978: 01 DW_LNS_copy - 0x00000000000005ce 130 14 1 0 0 + 0x00000000000005cb 128 22 1 0 0 -0x00000979: 00 DW_LNE_set_address (0x00000000000005dd) -0x00000980: 05 DW_LNS_set_column (25) -0x00000982: 01 DW_LNS_copy - 0x00000000000005dd 130 25 1 0 0 +0x00000979: 00 DW_LNE_set_address (0x00000000000005d0) +0x00000980: 03 DW_LNS_advance_line (130) +0x00000982: 05 DW_LNS_set_column (16) +0x00000984: 06 DW_LNS_negate_stmt +0x00000985: 01 DW_LNS_copy + 0x00000000000005d0 130 16 1 0 0 is_stmt -0x00000983: 00 DW_LNE_set_address (0x00000000000005e4) -0x0000098a: 03 DW_LNS_advance_line (133) -0x0000098c: 05 DW_LNS_set_column (11) -0x0000098e: 06 DW_LNS_negate_stmt -0x0000098f: 01 DW_LNS_copy - 0x00000000000005e4 133 11 1 0 0 is_stmt +0x00000986: 00 DW_LNE_set_address (0x00000000000005d8) +0x0000098d: 05 DW_LNS_set_column (14) +0x0000098f: 06 DW_LNS_negate_stmt +0x00000990: 01 DW_LNS_copy + 0x00000000000005d8 130 14 1 0 0 -0x00000990: 00 DW_LNE_set_address (0x00000000000005e9) -0x00000997: 03 DW_LNS_advance_line (122) -0x00000999: 05 DW_LNS_set_column (16) -0x0000099b: 01 DW_LNS_copy - 0x00000000000005e9 122 16 1 0 0 is_stmt +0x00000991: 00 DW_LNE_set_address (0x00000000000005e7) +0x00000998: 05 DW_LNS_set_column (25) +0x0000099a: 01 DW_LNS_copy + 0x00000000000005e7 130 25 1 0 0 -0x0000099c: 00 DW_LNE_set_address (0x00000000000005ee) -0x000009a3: 05 DW_LNS_set_column (14) -0x000009a5: 06 DW_LNS_negate_stmt -0x000009a6: 01 DW_LNS_copy - 0x00000000000005ee 122 14 1 0 0 +0x0000099b: 00 DW_LNE_set_address (0x00000000000005ee) +0x000009a2: 03 DW_LNS_advance_line (133) +0x000009a4: 05 DW_LNS_set_column (11) +0x000009a6: 06 DW_LNS_negate_stmt +0x000009a7: 01 DW_LNS_copy + 0x00000000000005ee 133 11 1 0 0 is_stmt -0x000009a7: 00 DW_LNE_set_address (0x00000000000005f4) -0x000009ae: 03 DW_LNS_advance_line (110) -0x000009b0: 05 DW_LNS_set_column (11) -0x000009b2: 06 DW_LNS_negate_stmt +0x000009a8: 00 DW_LNE_set_address (0x00000000000005f3) +0x000009af: 03 DW_LNS_advance_line (122) +0x000009b1: 05 DW_LNS_set_column (16) 0x000009b3: 01 DW_LNS_copy - 0x00000000000005f4 110 11 1 0 0 is_stmt + 0x00000000000005f3 122 16 1 0 0 is_stmt -0x000009b4: 00 DW_LNE_set_address (0x00000000000005fa) -0x000009bb: 03 DW_LNS_advance_line (138) -0x000009bd: 05 DW_LNS_set_column (4) -0x000009bf: 01 DW_LNS_copy - 0x00000000000005fa 138 4 1 0 0 is_stmt +0x000009b4: 00 DW_LNE_set_address (0x00000000000005f8) +0x000009bb: 05 DW_LNS_set_column (14) +0x000009bd: 06 DW_LNS_negate_stmt +0x000009be: 01 DW_LNS_copy + 0x00000000000005f8 122 14 1 0 0 -0x000009c0: 00 DW_LNE_set_address (0x00000000000005fe) -0x000009c7: 03 DW_LNS_advance_line (139) -0x000009c9: 01 DW_LNS_copy - 0x00000000000005fe 139 4 1 0 0 is_stmt +0x000009bf: 00 DW_LNE_set_address (0x00000000000005fe) +0x000009c6: 03 DW_LNS_advance_line (110) +0x000009c8: 05 DW_LNS_set_column (11) +0x000009ca: 06 DW_LNS_negate_stmt +0x000009cb: 01 DW_LNS_copy + 0x00000000000005fe 110 11 1 0 0 is_stmt -0x000009ca: 00 DW_LNE_set_address (0x000000000000060e) -0x000009d1: 03 DW_LNS_advance_line (142) -0x000009d3: 05 DW_LNS_set_column (20) -0x000009d5: 01 DW_LNS_copy - 0x000000000000060e 142 20 1 0 0 is_stmt +0x000009cc: 00 DW_LNE_set_address (0x0000000000000604) +0x000009d3: 03 DW_LNS_advance_line (138) +0x000009d5: 05 DW_LNS_set_column (4) +0x000009d7: 01 DW_LNS_copy + 0x0000000000000604 138 4 1 0 0 is_stmt -0x000009d6: 00 DW_LNE_set_address (0x0000000000000616) -0x000009dd: 03 DW_LNS_advance_line (146) -0x000009df: 01 DW_LNS_copy - 0x0000000000000616 146 20 1 0 0 is_stmt +0x000009d8: 00 DW_LNE_set_address (0x0000000000000608) +0x000009df: 03 DW_LNS_advance_line (139) +0x000009e1: 01 DW_LNS_copy + 0x0000000000000608 139 4 1 0 0 is_stmt -0x000009e0: 00 DW_LNE_set_address (0x000000000000061d) -0x000009e7: 03 DW_LNS_advance_line (147) -0x000009e9: 05 DW_LNS_set_column (7) -0x000009eb: 01 DW_LNS_copy - 0x000000000000061d 147 7 1 0 0 is_stmt +0x000009e2: 00 DW_LNE_set_address (0x0000000000000618) +0x000009e9: 03 DW_LNS_advance_line (142) +0x000009eb: 05 DW_LNS_set_column (20) +0x000009ed: 01 DW_LNS_copy + 0x0000000000000618 142 20 1 0 0 is_stmt -0x000009ec: 00 DW_LNE_set_address (0x0000000000000621) -0x000009f3: 03 DW_LNS_advance_line (143) -0x000009f5: 05 DW_LNS_set_column (11) +0x000009ee: 00 DW_LNE_set_address (0x0000000000000620) +0x000009f5: 03 DW_LNS_advance_line (146) 0x000009f7: 01 DW_LNS_copy - 0x0000000000000621 143 11 1 0 0 is_stmt + 0x0000000000000620 146 20 1 0 0 is_stmt + + +0x000009f8: 00 DW_LNE_set_address (0x0000000000000627) +0x000009ff: 03 DW_LNS_advance_line (147) +0x00000a01: 05 DW_LNS_set_column (7) +0x00000a03: 01 DW_LNS_copy + 0x0000000000000627 147 7 1 0 0 is_stmt + +0x00000a04: 00 DW_LNE_set_address (0x000000000000062b) +0x00000a0b: 03 DW_LNS_advance_line (143) +0x00000a0d: 05 DW_LNS_set_column (11) +0x00000a0f: 01 DW_LNS_copy + 0x000000000000062b 143 11 1 0 0 is_stmt -0x000009f8: 00 DW_LNE_set_address (0x0000000000000625) -0x000009ff: 05 DW_LNS_set_column (20) -0x00000a01: 06 DW_LNS_negate_stmt -0x00000a02: 01 DW_LNS_copy - 0x0000000000000625 143 20 1 0 0 +0x00000a10: 00 DW_LNE_set_address (0x000000000000062f) +0x00000a17: 05 DW_LNS_set_column (20) +0x00000a19: 06 DW_LNS_negate_stmt +0x00000a1a: 01 DW_LNS_copy + 0x000000000000062f 143 20 1 0 0 -0x00000a03: 00 DW_LNE_set_address (0x000000000000062a) -0x00000a0a: 05 DW_LNS_set_column (11) -0x00000a0c: 01 DW_LNS_copy - 0x000000000000062a 143 11 1 0 0 +0x00000a1b: 00 DW_LNE_set_address (0x0000000000000634) +0x00000a22: 05 DW_LNS_set_column (11) +0x00000a24: 01 DW_LNS_copy + 0x0000000000000634 143 11 1 0 0 -0x00000a0d: 00 DW_LNE_set_address (0x0000000000000631) -0x00000a14: 03 DW_LNS_advance_line (141) -0x00000a16: 05 DW_LNS_set_column (4) -0x00000a18: 06 DW_LNS_negate_stmt -0x00000a19: 01 DW_LNS_copy - 0x0000000000000631 141 4 1 0 0 is_stmt +0x00000a25: 00 DW_LNE_set_address (0x000000000000063b) +0x00000a2c: 03 DW_LNS_advance_line (141) +0x00000a2e: 05 DW_LNS_set_column (4) +0x00000a30: 06 DW_LNS_negate_stmt +0x00000a31: 01 DW_LNS_copy + 0x000000000000063b 141 4 1 0 0 is_stmt -0x00000a1a: 00 DW_LNE_set_address (0x0000000000000637) -0x00000a21: 03 DW_LNS_advance_line (159) -0x00000a23: 01 DW_LNS_copy - 0x0000000000000637 159 4 1 0 0 is_stmt +0x00000a32: 00 DW_LNE_set_address (0x0000000000000641) +0x00000a39: 03 DW_LNS_advance_line (159) +0x00000a3b: 01 DW_LNS_copy + 0x0000000000000641 159 4 1 0 0 is_stmt -0x00000a24: 00 DW_LNE_set_address (0x000000000000064e) -0x00000a2b: 03 DW_LNS_advance_line (161) -0x00000a2d: 05 DW_LNS_set_column (1) -0x00000a2f: 01 DW_LNS_copy - 0x000000000000064e 161 1 1 0 0 is_stmt +0x00000a3c: 00 DW_LNE_set_address (0x0000000000000658) +0x00000a43: 03 DW_LNS_advance_line (161) +0x00000a45: 05 DW_LNS_set_column (1) +0x00000a47: 01 DW_LNS_copy + 0x0000000000000658 161 1 1 0 0 is_stmt -0x00000a30: 00 DW_LNE_set_address (0x0000000000000658) -0x00000a37: 00 DW_LNE_end_sequence - 0x0000000000000658 161 1 1 0 0 is_stmt end_sequence + +0x00000a48: 00 DW_LNE_set_address (0x0000000000000662) +0x00000a4f: 00 DW_LNE_end_sequence + 0x0000000000000662 161 1 1 0 0 is_stmt end_sequence .debug_str contents: @@ -4646,16 +4660,16 @@ file_names[ 4]: 0x000001ad: "char" .debug_ranges contents: -00000000 00000176 000001b4 -00000000 000001de 000001e7 -00000000 000002f2 00000330 -00000000 0000035a 00000363 +00000000 0000017f 000001bd +00000000 000001e7 000001f0 +00000000 000002fc 0000033a +00000000 00000364 0000036d 00000000 -00000028 000004c3 00000508 -00000028 0000057b 000005c6 +00000028 000004cd 00000512 +00000028 00000585 000005d0 00000028 -00000040 00000006 00000377 -00000040 00000379 00000658 +00000040 00000006 00000381 +00000040 00000383 00000662 00000040 (module (type $0 (func (param i32) (result i32))) @@ -4736,686 +4750,699 @@ file_names[ 4]: (local.get $12) ) ) - ;; code offset: 0x43 - 0x368 - (block $block1 - ;; code offset: 0x4a - 0x1ec - (if - ;; code offset: 0x49 - 0x4a - (i32.gt_s - ;; code offset: 0x45 - 0x47 - (local.get $2) - ;; code offset: 0x47 - 0x49 - (i32.const 0) - ) - (then - ;; code offset: 0x4c - 0x68 - (loop $label - ;; code offset: 0x58 - 0x5b - (i32.store - ;; code offset: 0x55 - 0x56 - (i32.add - ;; code offset: 0x4e - 0x50 - (local.get $3) - ;; code offset: 0x54 - 0x55 - (i32.shl + ;; code offset: 0x43 - 0x372 + (block $block2 + ;; code offset: 0x45 - 0x21c + (block $block + ;; code offset: 0x4c - 0x1f5 + (if + ;; code offset: 0x4b - 0x4c + (i32.gt_s + ;; code offset: 0x47 - 0x49 + (local.get $2) + ;; code offset: 0x49 - 0x4b + (i32.const 0) + ) + (then + ;; code offset: 0x4e - 0x6a + (loop $label + ;; code offset: 0x5a - 0x5d + (i32.store + ;; code offset: 0x57 - 0x58 + (i32.add ;; code offset: 0x50 - 0x52 - (local.get $1) - ;; code offset: 0x52 - 0x54 - (i32.const 2) - ) - ) - ;; code offset: 0x56 - 0x58 - (local.get $1) - ) - ;; code offset: 0x65 - 0x67 - (br_if $label - ;; code offset: 0x64 - 0x65 - (i32.ne - ;; code offset: 0x60 - 0x62 - (local.tee $1 - ;; code offset: 0x5f - 0x60 - (i32.add - ;; code offset: 0x5b - 0x5d + (local.get $3) + ;; code offset: 0x56 - 0x57 + (i32.shl + ;; code offset: 0x52 - 0x54 (local.get $1) - ;; code offset: 0x5d - 0x5f - (i32.const 1) + ;; code offset: 0x54 - 0x56 + (i32.const 2) ) ) - ;; code offset: 0x62 - 0x64 - (local.get $2) + ;; code offset: 0x58 - 0x5a + (local.get $1) ) - ) - ) - ;; code offset: 0x7c - 0x7f - (i32.store - ;; code offset: 0x74 - 0x75 - (i32.add - ;; code offset: 0x68 - 0x6a - (local.get $3) - ;; code offset: 0x73 - 0x74 - (i32.shl - ;; code offset: 0x6f - 0x71 - (local.tee $1 - ;; code offset: 0x6c - 0x6f - (i32.load - ;; code offset: 0x6a - 0x6c - (local.get $0) + ;; code offset: 0x67 - 0x69 + (br_if $label + ;; code offset: 0x66 - 0x67 + (i32.ne + ;; code offset: 0x62 - 0x64 + (local.tee $1 + ;; code offset: 0x61 - 0x62 + (i32.add + ;; code offset: 0x5d - 0x5f + (local.get $1) + ;; code offset: 0x5f - 0x61 + (i32.const 1) + ) ) + ;; code offset: 0x64 - 0x66 + (local.get $2) ) - ;; code offset: 0x71 - 0x73 - (i32.const 2) ) ) - ;; code offset: 0x7a - 0x7c - (local.tee $4 - ;; code offset: 0x79 - 0x7a - (i32.sub - ;; code offset: 0x75 - 0x77 - (local.get $2) - ;; code offset: 0x77 - 0x79 - (i32.const 1) - ) - ) - ) - ;; code offset: 0x8b - 0x8e - (i32.store - ;; code offset: 0x87 - 0x89 - (local.tee $13 - ;; code offset: 0x86 - 0x87 + ;; code offset: 0x7e - 0x81 + (i32.store + ;; code offset: 0x76 - 0x77 (i32.add - ;; code offset: 0x7f - 0x81 + ;; code offset: 0x6a - 0x6c (local.get $3) - ;; code offset: 0x85 - 0x86 + ;; code offset: 0x75 - 0x76 (i32.shl - ;; code offset: 0x81 - 0x83 - (local.get $4) - ;; code offset: 0x83 - 0x85 + ;; code offset: 0x71 - 0x73 + (local.tee $1 + ;; code offset: 0x6e - 0x71 + (i32.load + ;; code offset: 0x6c - 0x6e + (local.get $0) + ) + ) + ;; code offset: 0x73 - 0x75 (i32.const 2) ) ) + ;; code offset: 0x7c - 0x7e + (local.tee $4 + ;; code offset: 0x7b - 0x7c + (i32.sub + ;; code offset: 0x77 - 0x79 + (local.get $2) + ;; code offset: 0x79 - 0x7b + (i32.const 1) + ) + ) ) - ;; code offset: 0x89 - 0x8b - (local.get $1) - ) - ;; code offset: 0x8e - 0x1ea - (loop $label5 - ;; code offset: 0x95 - 0xb8 - (if + ;; code offset: 0x8d - 0x90 + (i32.store + ;; code offset: 0x89 - 0x8b + (local.tee $13 + ;; code offset: 0x88 - 0x89 + (i32.add + ;; code offset: 0x81 - 0x83 + (local.get $3) + ;; code offset: 0x87 - 0x88 + (i32.shl + ;; code offset: 0x83 - 0x85 + (local.get $4) + ;; code offset: 0x85 - 0x87 + (i32.const 2) + ) + ) + ) + ;; code offset: 0x8b - 0x8d + (local.get $1) + ) + ;; code offset: 0x95 - 0x97 + (br_if $block ;; code offset: 0x94 - 0x95 - (i32.gt_s + (i32.le_s ;; code offset: 0x90 - 0x92 (local.get $2) ;; code offset: 0x92 - 0x94 - (i32.const 1) + (i32.const 0) ) - (then - ;; code offset: 0x97 - 0xb7 - (loop $label1 - ;; code offset: 0xa8 - 0xab - (i32.store - ;; code offset: 0xa5 - 0xa6 - (i32.add - ;; code offset: 0x99 - 0x9b - (local.get $9) - ;; code offset: 0xa4 - 0xa5 - (i32.shl - ;; code offset: 0xa0 - 0xa2 - (local.tee $1 - ;; code offset: 0x9f - 0xa0 - (i32.sub - ;; code offset: 0x9b - 0x9d - (local.get $2) - ;; code offset: 0x9d - 0x9f - (i32.const 1) - ) - ) + ) + ;; code offset: 0x97 - 0x1f3 + (loop $label5 + ;; code offset: 0x9e - 0xc1 + (if + ;; code offset: 0x9d - 0x9e + (i32.gt_s + ;; code offset: 0x99 - 0x9b + (local.get $2) + ;; code offset: 0x9b - 0x9d + (i32.const 1) + ) + (then + ;; code offset: 0xa0 - 0xc0 + (loop $label1 + ;; code offset: 0xb1 - 0xb4 + (i32.store + ;; code offset: 0xae - 0xaf + (i32.add ;; code offset: 0xa2 - 0xa4 - (i32.const 2) - ) - ) - ;; code offset: 0xa6 - 0xa8 - (local.get $2) - ) - ;; code offset: 0xb4 - 0xb6 - (br_if $label1 - (block (result i32) - (local.set $scratch - ;; code offset: 0xaf - 0xb0 - (i32.gt_s + (local.get $9) + ;; code offset: 0xad - 0xae + (i32.shl + ;; code offset: 0xa9 - 0xab + (local.tee $1 + ;; code offset: 0xa8 - 0xa9 + (i32.sub + ;; code offset: 0xa4 - 0xa6 + (local.get $2) + ;; code offset: 0xa6 - 0xa8 + (i32.const 1) + ) + ) ;; code offset: 0xab - 0xad - (local.get $2) - ;; code offset: 0xad - 0xaf (i32.const 2) ) ) - ;; code offset: 0xb2 - 0xb4 - (local.set $2 - ;; code offset: 0xb0 - 0xb2 - (local.get $1) + ;; code offset: 0xaf - 0xb1 + (local.get $2) + ) + ;; code offset: 0xbd - 0xbf + (br_if $label1 + (block (result i32) + (local.set $scratch + ;; code offset: 0xb8 - 0xb9 + (i32.gt_s + ;; code offset: 0xb4 - 0xb6 + (local.get $2) + ;; code offset: 0xb6 - 0xb8 + (i32.const 2) + ) + ) + ;; code offset: 0xbb - 0xbd + (local.set $2 + ;; code offset: 0xb9 - 0xbb + (local.get $1) + ) + (local.get $scratch) ) - (local.get $scratch) ) ) ) ) - ) - ;; code offset: 0xb8 - 0x169 - (block $block - ;; code offset: 0xc2 - 0xc4 - (br_if $block - ;; code offset: 0xc1 - 0xc2 - (i32.eqz - ;; code offset: 0xbf - 0xc1 - (local.tee $10 - ;; code offset: 0xbc - 0xbf - (i32.load - ;; code offset: 0xba - 0xbc - (local.get $3) + ;; code offset: 0xc1 - 0x172 + (block $block1 + ;; code offset: 0xcb - 0xcd + (br_if $block1 + ;; code offset: 0xca - 0xcb + (i32.eqz + ;; code offset: 0xc8 - 0xca + (local.tee $10 + ;; code offset: 0xc5 - 0xc8 + (i32.load + ;; code offset: 0xc3 - 0xc5 + (local.get $3) + ) ) ) ) - ) - ;; code offset: 0xcc - 0xce - (br_if $block - ;; code offset: 0xcb - 0xcc - (i32.eq - ;; code offset: 0xc6 - 0xc9 - (i32.load - ;; code offset: 0xc4 - 0xc6 - (local.get $13) + ;; code offset: 0xd5 - 0xd7 + (br_if $block1 + ;; code offset: 0xd4 - 0xd5 + (i32.eq + ;; code offset: 0xcf - 0xd2 + (i32.load + ;; code offset: 0xcd - 0xcf + (local.get $13) + ) + ;; code offset: 0xd2 - 0xd4 + (local.get $4) ) - ;; code offset: 0xc9 - 0xcb - (local.get $4) ) - ) - ;; code offset: 0xdb - 0xdd - (local.set $6 - ;; code offset: 0xd8 - 0xdb - (i32.load - ;; code offset: 0xd6 - 0xd8 - (local.tee $11 - ;; code offset: 0xd4 - 0xd6 - (call $memcpy - ;; code offset: 0xce - 0xd0 - (local.get $8) - ;; code offset: 0xd0 - 0xd2 - (local.get $3) - ;; code offset: 0xd2 - 0xd4 - (local.get $12) + ;; code offset: 0xe4 - 0xe6 + (local.set $6 + ;; code offset: 0xe1 - 0xe4 + (i32.load + ;; code offset: 0xdf - 0xe1 + (local.tee $11 + ;; code offset: 0xdd - 0xdf + (call $memcpy + ;; code offset: 0xd7 - 0xd9 + (local.get $8) + ;; code offset: 0xd9 - 0xdb + (local.get $3) + ;; code offset: 0xdb - 0xdd + (local.get $12) + ) ) ) ) - ) - ;; code offset: 0xdf - 0xe1 - (local.set $0 - ;; code offset: 0xdd - 0xdf - (i32.const 0) - ) - ;; code offset: 0xe1 - 0x15c - (loop $label3 - ;; code offset: 0xe5 - 0xe7 - (local.set $16 - ;; code offset: 0xe3 - 0xe5 - (local.get $0) + ;; code offset: 0xe8 - 0xea + (local.set $0 + ;; code offset: 0xe6 - 0xe8 + (i32.const 0) ) - ;; code offset: 0xec - 0x136 - (if - ;; code offset: 0xeb - 0xec - (i32.ge_s - ;; code offset: 0xe7 - 0xe9 - (local.get $6) - ;; code offset: 0xe9 - 0xeb - (i32.const 3) + ;; code offset: 0xea - 0x165 + (loop $label3 + ;; code offset: 0xee - 0xf0 + (local.set $16 + ;; code offset: 0xec - 0xee + (local.get $0) ) - (then - ;; code offset: 0xf3 - 0xf5 - (local.set $1 - ;; code offset: 0xf2 - 0xf3 - (i32.sub - ;; code offset: 0xee - 0xf0 - (local.get $6) - ;; code offset: 0xf0 - 0xf2 + ;; code offset: 0xf5 - 0x13f + (if + ;; code offset: 0xf4 - 0xf5 + (i32.ge_s + ;; code offset: 0xf0 - 0xf2 + (local.get $6) + ;; code offset: 0xf2 - 0xf4 + (i32.const 3) + ) + (then + ;; code offset: 0xfc - 0xfe + (local.set $1 + ;; code offset: 0xfb - 0xfc + (i32.sub + ;; code offset: 0xf7 - 0xf9 + (local.get $6) + ;; code offset: 0xf9 - 0xfb + (i32.const 1) + ) + ) + ;; code offset: 0x100 - 0x102 + (local.set $0 + ;; code offset: 0xfe - 0x100 (i32.const 1) ) - ) - ;; code offset: 0xf7 - 0xf9 - (local.set $0 - ;; code offset: 0xf5 - 0xf7 - (i32.const 1) - ) - ;; code offset: 0xf9 - 0x135 - (loop $label2 - ;; code offset: 0x108 - 0x10a - (local.set $15 - ;; code offset: 0x105 - 0x108 - (i32.load - ;; code offset: 0x103 - 0x105 - (local.tee $14 - ;; code offset: 0x102 - 0x103 - (i32.add - ;; code offset: 0xfb - 0xfd - (local.get $11) - ;; code offset: 0x101 - 0x102 - (i32.shl - ;; code offset: 0xfd - 0xff - (local.get $0) - ;; code offset: 0xff - 0x101 - (i32.const 2) + ;; code offset: 0x102 - 0x13e + (loop $label2 + ;; code offset: 0x111 - 0x113 + (local.set $15 + ;; code offset: 0x10e - 0x111 + (i32.load + ;; code offset: 0x10c - 0x10e + (local.tee $14 + ;; code offset: 0x10b - 0x10c + (i32.add + ;; code offset: 0x104 - 0x106 + (local.get $11) + ;; code offset: 0x10a - 0x10b + (i32.shl + ;; code offset: 0x106 - 0x108 + (local.get $0) + ;; code offset: 0x108 - 0x10a + (i32.const 2) + ) ) ) ) ) - ) - ;; code offset: 0x119 - 0x11c - (i32.store - ;; code offset: 0x10a - 0x10c - (local.get $14) - ;; code offset: 0x116 - 0x119 - (i32.load - ;; code offset: 0x114 - 0x116 - (local.tee $7 - ;; code offset: 0x113 - 0x114 - (i32.add - ;; code offset: 0x10c - 0x10e - (local.get $11) - ;; code offset: 0x112 - 0x113 - (i32.shl - ;; code offset: 0x10e - 0x110 - (local.get $1) - ;; code offset: 0x110 - 0x112 - (i32.const 2) + ;; code offset: 0x122 - 0x125 + (i32.store + ;; code offset: 0x113 - 0x115 + (local.get $14) + ;; code offset: 0x11f - 0x122 + (i32.load + ;; code offset: 0x11d - 0x11f + (local.tee $7 + ;; code offset: 0x11c - 0x11d + (i32.add + ;; code offset: 0x115 - 0x117 + (local.get $11) + ;; code offset: 0x11b - 0x11c + (i32.shl + ;; code offset: 0x117 - 0x119 + (local.get $1) + ;; code offset: 0x119 - 0x11b + (i32.const 2) + ) ) ) ) ) - ) - ;; code offset: 0x120 - 0x123 - (i32.store - ;; code offset: 0x11c - 0x11e - (local.get $7) - ;; code offset: 0x11e - 0x120 - (local.get $15) - ) - ;; code offset: 0x132 - 0x134 - (br_if $label2 - ;; code offset: 0x131 - 0x132 - (i32.lt_s - ;; code offset: 0x128 - 0x12a - (local.tee $0 - ;; code offset: 0x127 - 0x128 - (i32.add - ;; code offset: 0x123 - 0x125 - (local.get $0) - ;; code offset: 0x125 - 0x127 - (i32.const 1) + ;; code offset: 0x129 - 0x12c + (i32.store + ;; code offset: 0x125 - 0x127 + (local.get $7) + ;; code offset: 0x127 - 0x129 + (local.get $15) + ) + ;; code offset: 0x13b - 0x13d + (br_if $label2 + ;; code offset: 0x13a - 0x13b + (i32.lt_s + ;; code offset: 0x131 - 0x133 + (local.tee $0 + ;; code offset: 0x130 - 0x131 + (i32.add + ;; code offset: 0x12c - 0x12e + (local.get $0) + ;; code offset: 0x12e - 0x130 + (i32.const 1) + ) ) - ) - ;; code offset: 0x12f - 0x131 - (local.tee $1 - ;; code offset: 0x12e - 0x12f - (i32.sub - ;; code offset: 0x12a - 0x12c - (local.get $1) - ;; code offset: 0x12c - 0x12e - (i32.const 1) + ;; code offset: 0x138 - 0x13a + (local.tee $1 + ;; code offset: 0x137 - 0x138 + (i32.sub + ;; code offset: 0x133 - 0x135 + (local.get $1) + ;; code offset: 0x135 - 0x137 + (i32.const 1) + ) ) ) ) ) ) ) - ) - ;; code offset: 0x143 - 0x145 - (local.set $1 - ;; code offset: 0x140 - 0x143 - (i32.load - ;; code offset: 0x13e - 0x140 - (local.tee $0 - ;; code offset: 0x13d - 0x13e - (i32.add - ;; code offset: 0x136 - 0x138 - (local.get $11) - ;; code offset: 0x13c - 0x13d - (i32.shl - ;; code offset: 0x138 - 0x13a - (local.get $6) - ;; code offset: 0x13a - 0x13c - (i32.const 2) + ;; code offset: 0x14c - 0x14e + (local.set $1 + ;; code offset: 0x149 - 0x14c + (i32.load + ;; code offset: 0x147 - 0x149 + (local.tee $0 + ;; code offset: 0x146 - 0x147 + (i32.add + ;; code offset: 0x13f - 0x141 + (local.get $11) + ;; code offset: 0x145 - 0x146 + (i32.shl + ;; code offset: 0x141 - 0x143 + (local.get $6) + ;; code offset: 0x143 - 0x145 + (i32.const 2) + ) ) ) ) ) - ) - ;; code offset: 0x149 - 0x14c - (i32.store - ;; code offset: 0x145 - 0x147 - (local.get $0) - ;; code offset: 0x147 - 0x149 - (local.get $6) - ) - ;; code offset: 0x151 - 0x153 - (local.set $0 - ;; code offset: 0x150 - 0x151 - (i32.add - ;; code offset: 0x14c - 0x14e - (local.get $16) + ;; code offset: 0x152 - 0x155 + (i32.store ;; code offset: 0x14e - 0x150 - (i32.const 1) + (local.get $0) + ;; code offset: 0x150 - 0x152 + (local.get $6) + ) + ;; code offset: 0x15a - 0x15c + (local.set $0 + ;; code offset: 0x159 - 0x15a + (i32.add + ;; code offset: 0x155 - 0x157 + (local.get $16) + ;; code offset: 0x157 - 0x159 + (i32.const 1) + ) ) - ) - ;; code offset: 0x155 - 0x157 - (local.set $6 - ;; code offset: 0x153 - 0x155 - (local.get $1) - ) - ;; code offset: 0x159 - 0x15b - (br_if $label3 - ;; code offset: 0x157 - 0x159 - (local.get $1) - ) - ) - ;; code offset: 0x166 - 0x168 - (local.set $5 - ;; code offset: 0x165 - 0x166 - (select - ;; code offset: 0x15c - 0x15e - (local.get $5) ;; code offset: 0x15e - 0x160 - (local.get $0) - ;; code offset: 0x164 - 0x165 - (i32.gt_s + (local.set $6 + ;; code offset: 0x15c - 0x15e + (local.get $1) + ) + ;; code offset: 0x162 - 0x164 + (br_if $label3 ;; code offset: 0x160 - 0x162 + (local.get $1) + ) + ) + ;; code offset: 0x16f - 0x171 + (local.set $5 + ;; code offset: 0x16e - 0x16f + (select + ;; code offset: 0x165 - 0x167 (local.get $5) - ;; code offset: 0x162 - 0x164 - (local.get $16) + ;; code offset: 0x167 - 0x169 + (local.get $0) + ;; code offset: 0x16d - 0x16e + (i32.gt_s + ;; code offset: 0x169 - 0x16b + (local.get $5) + ;; code offset: 0x16b - 0x16d + (local.get $16) + ) ) ) ) - ) - ;; code offset: 0x16e - 0x170 - (br_if $block1 - ;; code offset: 0x16d - 0x16e - (i32.ge_s - ;; code offset: 0x169 - 0x16b - (local.get $2) - ;; code offset: 0x16b - 0x16d - (local.get $4) - ) - ) - ;; code offset: 0x170 - 0x1e8 - (loop $label6 - ;; code offset: 0x174 - 0x176 - (local.set $1 - ;; code offset: 0x172 - 0x174 - (i32.const 0) - ) - ;; code offset: 0x17b - 0x1a7 - (if - ;; code offset: 0x17a - 0x17b - (i32.gt_s - ;; code offset: 0x176 - 0x178 + ;; code offset: 0x177 - 0x179 + (br_if $block2 + ;; code offset: 0x176 - 0x177 + (i32.ge_s + ;; code offset: 0x172 - 0x174 (local.get $2) - ;; code offset: 0x178 - 0x17a + ;; code offset: 0x174 - 0x176 + (local.get $4) + ) + ) + ;; code offset: 0x179 - 0x1f1 + (loop $label6 + ;; code offset: 0x17d - 0x17f + (local.set $1 + ;; code offset: 0x17b - 0x17d (i32.const 0) ) - (then - ;; code offset: 0x17d - 0x1a2 - (loop $label4 - ;; code offset: 0x197 - 0x19a - (i32.store - ;; code offset: 0x186 - 0x187 - (i32.add - ;; code offset: 0x17f - 0x181 - (local.get $3) - ;; code offset: 0x185 - 0x186 - (i32.shl - ;; code offset: 0x181 - 0x183 - (local.get $1) - ;; code offset: 0x183 - 0x185 - (i32.const 2) - ) - ) - ;; code offset: 0x194 - 0x197 - (i32.load - ;; code offset: 0x193 - 0x194 + ;; code offset: 0x184 - 0x1b0 + (if + ;; code offset: 0x183 - 0x184 + (i32.gt_s + ;; code offset: 0x17f - 0x181 + (local.get $2) + ;; code offset: 0x181 - 0x183 + (i32.const 0) + ) + (then + ;; code offset: 0x186 - 0x1ab + (loop $label4 + ;; code offset: 0x1a0 - 0x1a3 + (i32.store + ;; code offset: 0x18f - 0x190 (i32.add - ;; code offset: 0x187 - 0x189 + ;; code offset: 0x188 - 0x18a (local.get $3) - ;; code offset: 0x192 - 0x193 + ;; code offset: 0x18e - 0x18f (i32.shl - ;; code offset: 0x18e - 0x190 - (local.tee $1 - ;; code offset: 0x18d - 0x18e - (i32.add - ;; code offset: 0x189 - 0x18b - (local.get $1) - ;; code offset: 0x18b - 0x18d - (i32.const 1) + ;; code offset: 0x18a - 0x18c + (local.get $1) + ;; code offset: 0x18c - 0x18e + (i32.const 2) + ) + ) + ;; code offset: 0x19d - 0x1a0 + (i32.load + ;; code offset: 0x19c - 0x19d + (i32.add + ;; code offset: 0x190 - 0x192 + (local.get $3) + ;; code offset: 0x19b - 0x19c + (i32.shl + ;; code offset: 0x197 - 0x199 + (local.tee $1 + ;; code offset: 0x196 - 0x197 + (i32.add + ;; code offset: 0x192 - 0x194 + (local.get $1) + ;; code offset: 0x194 - 0x196 + (i32.const 1) + ) ) + ;; code offset: 0x199 - 0x19b + (i32.const 2) ) - ;; code offset: 0x190 - 0x192 - (i32.const 2) ) ) ) - ) - ;; code offset: 0x19f - 0x1a1 - (br_if $label4 - ;; code offset: 0x19e - 0x19f - (i32.ne - ;; code offset: 0x19a - 0x19c - (local.get $1) - ;; code offset: 0x19c - 0x19e - (local.get $2) + ;; code offset: 0x1a8 - 0x1aa + (br_if $label4 + ;; code offset: 0x1a7 - 0x1a8 + (i32.ne + ;; code offset: 0x1a3 - 0x1a5 + (local.get $1) + ;; code offset: 0x1a5 - 0x1a7 + (local.get $2) + ) ) ) - ) - ;; code offset: 0x1a4 - 0x1a6 - (local.set $1 - ;; code offset: 0x1a2 - 0x1a4 - (local.get $2) - ) - ) - ) - ;; code offset: 0x1b1 - 0x1b4 - (i32.store - ;; code offset: 0x1ae - 0x1af - (i32.add - ;; code offset: 0x1a7 - 0x1a9 - (local.get $3) - ;; code offset: 0x1ad - 0x1ae - (i32.shl - ;; code offset: 0x1a9 - 0x1ab - (local.get $1) - ;; code offset: 0x1ab - 0x1ad - (i32.const 2) + ;; code offset: 0x1ad - 0x1af + (local.set $1 + ;; code offset: 0x1ab - 0x1ad + (local.get $2) + ) ) ) - ;; code offset: 0x1af - 0x1b1 - (local.get $10) - ) - ;; code offset: 0x1c8 - 0x1cb - (i32.store - ;; code offset: 0x1bc - 0x1be - (local.tee $1 - ;; code offset: 0x1bb - 0x1bc + ;; code offset: 0x1ba - 0x1bd + (i32.store + ;; code offset: 0x1b7 - 0x1b8 (i32.add - ;; code offset: 0x1b4 - 0x1b6 - (local.get $9) - ;; code offset: 0x1ba - 0x1bb + ;; code offset: 0x1b0 - 0x1b2 + (local.get $3) + ;; code offset: 0x1b6 - 0x1b7 (i32.shl - ;; code offset: 0x1b6 - 0x1b8 - (local.get $2) - ;; code offset: 0x1b8 - 0x1ba + ;; code offset: 0x1b2 - 0x1b4 + (local.get $1) + ;; code offset: 0x1b4 - 0x1b6 (i32.const 2) ) ) + ;; code offset: 0x1b8 - 0x1ba + (local.get $10) ) - ;; code offset: 0x1c7 - 0x1c8 - (i32.sub - ;; code offset: 0x1c3 - 0x1c5 + ;; code offset: 0x1d1 - 0x1d4 + (i32.store + ;; code offset: 0x1c5 - 0x1c7 (local.tee $1 - ;; code offset: 0x1c0 - 0x1c3 - (i32.load - ;; code offset: 0x1be - 0x1c0 - (local.get $1) + ;; code offset: 0x1c4 - 0x1c5 + (i32.add + ;; code offset: 0x1bd - 0x1bf + (local.get $9) + ;; code offset: 0x1c3 - 0x1c4 + (i32.shl + ;; code offset: 0x1bf - 0x1c1 + (local.get $2) + ;; code offset: 0x1c1 - 0x1c3 + (i32.const 2) + ) ) ) - ;; code offset: 0x1c5 - 0x1c7 - (i32.const 1) + ;; code offset: 0x1d0 - 0x1d1 + (i32.sub + ;; code offset: 0x1cc - 0x1ce + (local.tee $1 + ;; code offset: 0x1c9 - 0x1cc + (i32.load + ;; code offset: 0x1c7 - 0x1c9 + (local.get $1) + ) + ) + ;; code offset: 0x1ce - 0x1d0 + (i32.const 1) + ) ) - ) - ;; code offset: 0x1d0 - 0x1d2 - (br_if $label5 - ;; code offset: 0x1cf - 0x1d0 - (i32.gt_s - ;; code offset: 0x1cb - 0x1cd - (local.get $1) - ;; code offset: 0x1cd - 0x1cf - (i32.const 1) + ;; code offset: 0x1d9 - 0x1db + (br_if $label5 + ;; code offset: 0x1d8 - 0x1d9 + (i32.gt_s + ;; code offset: 0x1d4 - 0x1d6 + (local.get $1) + ;; code offset: 0x1d6 - 0x1d8 + (i32.const 1) + ) ) - ) - ;; code offset: 0x1dc - 0x1de - (br_if $block1 - ;; code offset: 0x1db - 0x1dc - (i32.eq - ;; code offset: 0x1d7 - 0x1d9 - (local.tee $2 - ;; code offset: 0x1d6 - 0x1d7 - (i32.add - ;; code offset: 0x1d2 - 0x1d4 - (local.get $2) - ;; code offset: 0x1d4 - 0x1d6 - (i32.const 1) + ;; code offset: 0x1e5 - 0x1e7 + (br_if $block2 + ;; code offset: 0x1e4 - 0x1e5 + (i32.eq + ;; code offset: 0x1e0 - 0x1e2 + (local.tee $2 + ;; code offset: 0x1df - 0x1e0 + (i32.add + ;; code offset: 0x1db - 0x1dd + (local.get $2) + ;; code offset: 0x1dd - 0x1df + (i32.const 1) + ) ) + ;; code offset: 0x1e2 - 0x1e4 + (local.get $4) ) - ;; code offset: 0x1d9 - 0x1db - (local.get $4) ) - ) - ;; code offset: 0x1e3 - 0x1e5 - (local.set $10 - ;; code offset: 0x1e0 - 0x1e3 - (i32.load - ;; code offset: 0x1de - 0x1e0 - (local.get $3) + ;; code offset: 0x1ec - 0x1ee + (local.set $10 + ;; code offset: 0x1e9 - 0x1ec + (i32.load + ;; code offset: 0x1e7 - 0x1e9 + (local.get $3) + ) ) + ;; code offset: 0x1ee - 0x1f0 + (br $label6) ) - ;; code offset: 0x1e5 - 0x1e7 - (br $label6) + ;; code offset: 0x1f1 - 0x1f2 + (unreachable) ) - ;; code offset: 0x1e8 - 0x1e9 + ;; code offset: 0x1f3 - 0x1f4 (unreachable) ) - ;; code offset: 0x1ea - 0x1eb - (unreachable) ) - ) - ;; code offset: 0x200 - 0x203 - (i32.store - ;; code offset: 0x1f8 - 0x1f9 - (i32.add - ;; code offset: 0x1ec - 0x1ee - (local.get $3) - ;; code offset: 0x1f7 - 0x1f8 - (i32.shl - ;; code offset: 0x1f3 - 0x1f5 - (local.tee $1 - ;; code offset: 0x1f0 - 0x1f3 - (i32.load - ;; code offset: 0x1ee - 0x1f0 - (local.get $0) + ;; code offset: 0x209 - 0x20c + (i32.store + ;; code offset: 0x201 - 0x202 + (i32.add + ;; code offset: 0x1f5 - 0x1f7 + (local.get $3) + ;; code offset: 0x200 - 0x201 + (i32.shl + ;; code offset: 0x1fc - 0x1fe + (local.tee $1 + ;; code offset: 0x1f9 - 0x1fc + (i32.load + ;; code offset: 0x1f7 - 0x1f9 + (local.get $0) + ) ) + ;; code offset: 0x1fe - 0x200 + (i32.const 2) ) - ;; code offset: 0x1f5 - 0x1f7 - (i32.const 2) ) - ) - ;; code offset: 0x1fe - 0x200 - (local.tee $4 - ;; code offset: 0x1fd - 0x1fe - (i32.sub - ;; code offset: 0x1f9 - 0x1fb - (local.get $2) - ;; code offset: 0x1fb - 0x1fd - (i32.const 1) + ;; code offset: 0x207 - 0x209 + (local.tee $4 + ;; code offset: 0x206 - 0x207 + (i32.sub + ;; code offset: 0x202 - 0x204 + (local.get $2) + ;; code offset: 0x204 - 0x206 + (i32.const 1) + ) ) ) - ) - ;; code offset: 0x20f - 0x212 - (i32.store - ;; code offset: 0x20b - 0x20d - (local.tee $13 - ;; code offset: 0x20a - 0x20b - (i32.add - ;; code offset: 0x203 - 0x205 - (local.get $3) - ;; code offset: 0x209 - 0x20a - (i32.shl - ;; code offset: 0x205 - 0x207 - (local.get $4) - ;; code offset: 0x207 - 0x209 - (i32.const 2) + ;; code offset: 0x218 - 0x21b + (i32.store + ;; code offset: 0x214 - 0x216 + (local.tee $13 + ;; code offset: 0x213 - 0x214 + (i32.add + ;; code offset: 0x20c - 0x20e + (local.get $3) + ;; code offset: 0x212 - 0x213 + (i32.shl + ;; code offset: 0x20e - 0x210 + (local.get $4) + ;; code offset: 0x210 - 0x212 + (i32.const 2) + ) ) ) + ;; code offset: 0x216 - 0x218 + (local.get $1) ) - ;; code offset: 0x20d - 0x20f - (local.get $1) ) - ;; code offset: 0x212 - 0x366 + ;; code offset: 0x21c - 0x370 (loop $label11 - ;; code offset: 0x219 - 0x23c + ;; code offset: 0x223 - 0x246 (if - ;; code offset: 0x218 - 0x219 + ;; code offset: 0x222 - 0x223 (i32.ge_s - ;; code offset: 0x214 - 0x216 + ;; code offset: 0x21e - 0x220 (local.get $2) - ;; code offset: 0x216 - 0x218 + ;; code offset: 0x220 - 0x222 (i32.const 2) ) (then - ;; code offset: 0x21b - 0x23b + ;; code offset: 0x225 - 0x245 (loop $label7 - ;; code offset: 0x22c - 0x22f + ;; code offset: 0x236 - 0x239 (i32.store - ;; code offset: 0x229 - 0x22a + ;; code offset: 0x233 - 0x234 (i32.add - ;; code offset: 0x21d - 0x21f + ;; code offset: 0x227 - 0x229 (local.get $9) - ;; code offset: 0x228 - 0x229 + ;; code offset: 0x232 - 0x233 (i32.shl - ;; code offset: 0x224 - 0x226 + ;; code offset: 0x22e - 0x230 (local.tee $1 - ;; code offset: 0x223 - 0x224 + ;; code offset: 0x22d - 0x22e (i32.sub - ;; code offset: 0x21f - 0x221 + ;; code offset: 0x229 - 0x22b (local.get $2) - ;; code offset: 0x221 - 0x223 + ;; code offset: 0x22b - 0x22d (i32.const 1) ) ) - ;; code offset: 0x226 - 0x228 + ;; code offset: 0x230 - 0x232 (i32.const 2) ) ) - ;; code offset: 0x22a - 0x22c + ;; code offset: 0x234 - 0x236 (local.get $2) ) - ;; code offset: 0x238 - 0x23a + ;; code offset: 0x242 - 0x244 (br_if $label7 (block (result i32) (local.set $scratch_18 - ;; code offset: 0x233 - 0x234 + ;; code offset: 0x23d - 0x23e (i32.gt_s - ;; code offset: 0x22f - 0x231 + ;; code offset: 0x239 - 0x23b (local.get $2) - ;; code offset: 0x231 - 0x233 + ;; code offset: 0x23b - 0x23d (i32.const 2) ) ) - ;; code offset: 0x236 - 0x238 + ;; code offset: 0x240 - 0x242 (local.set $2 - ;; code offset: 0x234 - 0x236 + ;; code offset: 0x23e - 0x240 (local.get $1) ) (local.get $scratch_18) @@ -5424,154 +5451,154 @@ file_names[ 4]: ) ) ) - ;; code offset: 0x23c - 0x2e5 - (block $block2 - ;; code offset: 0x246 - 0x248 - (br_if $block2 - ;; code offset: 0x245 - 0x246 + ;; code offset: 0x246 - 0x2ef + (block $block3 + ;; code offset: 0x250 - 0x252 + (br_if $block3 + ;; code offset: 0x24f - 0x250 (i32.eqz - ;; code offset: 0x243 - 0x245 + ;; code offset: 0x24d - 0x24f (local.tee $6 - ;; code offset: 0x240 - 0x243 + ;; code offset: 0x24a - 0x24d (i32.load - ;; code offset: 0x23e - 0x240 + ;; code offset: 0x248 - 0x24a (local.get $3) ) ) ) ) - ;; code offset: 0x250 - 0x252 - (br_if $block2 - ;; code offset: 0x24f - 0x250 + ;; code offset: 0x25a - 0x25c + (br_if $block3 + ;; code offset: 0x259 - 0x25a (i32.eq - ;; code offset: 0x24a - 0x24d + ;; code offset: 0x254 - 0x257 (i32.load - ;; code offset: 0x248 - 0x24a + ;; code offset: 0x252 - 0x254 (local.get $13) ) - ;; code offset: 0x24d - 0x24f + ;; code offset: 0x257 - 0x259 (local.get $4) ) ) - ;; code offset: 0x257 - 0x259 + ;; code offset: 0x261 - 0x263 (local.set $7 - ;; code offset: 0x254 - 0x257 + ;; code offset: 0x25e - 0x261 (i32.load - ;; code offset: 0x252 - 0x254 + ;; code offset: 0x25c - 0x25e (local.get $8) ) ) - ;; code offset: 0x25b - 0x25d + ;; code offset: 0x265 - 0x267 (local.set $0 - ;; code offset: 0x259 - 0x25b + ;; code offset: 0x263 - 0x265 (i32.const 0) ) - ;; code offset: 0x25d - 0x2d8 + ;; code offset: 0x267 - 0x2e2 (loop $label9 - ;; code offset: 0x261 - 0x263 + ;; code offset: 0x26b - 0x26d (local.set $10 - ;; code offset: 0x25f - 0x261 + ;; code offset: 0x269 - 0x26b (local.get $0) ) - ;; code offset: 0x268 - 0x2b2 + ;; code offset: 0x272 - 0x2bc (if - ;; code offset: 0x267 - 0x268 + ;; code offset: 0x271 - 0x272 (i32.ge_s - ;; code offset: 0x263 - 0x265 + ;; code offset: 0x26d - 0x26f (local.get $7) - ;; code offset: 0x265 - 0x267 + ;; code offset: 0x26f - 0x271 (i32.const 3) ) (then - ;; code offset: 0x26f - 0x271 + ;; code offset: 0x279 - 0x27b (local.set $1 - ;; code offset: 0x26e - 0x26f + ;; code offset: 0x278 - 0x279 (i32.sub - ;; code offset: 0x26a - 0x26c + ;; code offset: 0x274 - 0x276 (local.get $7) - ;; code offset: 0x26c - 0x26e + ;; code offset: 0x276 - 0x278 (i32.const 1) ) ) - ;; code offset: 0x273 - 0x275 + ;; code offset: 0x27d - 0x27f (local.set $0 - ;; code offset: 0x271 - 0x273 + ;; code offset: 0x27b - 0x27d (i32.const 1) ) - ;; code offset: 0x275 - 0x2b1 + ;; code offset: 0x27f - 0x2bb (loop $label8 - ;; code offset: 0x284 - 0x286 + ;; code offset: 0x28e - 0x290 (local.set $14 - ;; code offset: 0x281 - 0x284 + ;; code offset: 0x28b - 0x28e (i32.load - ;; code offset: 0x27f - 0x281 + ;; code offset: 0x289 - 0x28b (local.tee $11 - ;; code offset: 0x27e - 0x27f + ;; code offset: 0x288 - 0x289 (i32.add - ;; code offset: 0x277 - 0x279 + ;; code offset: 0x281 - 0x283 (local.get $8) - ;; code offset: 0x27d - 0x27e + ;; code offset: 0x287 - 0x288 (i32.shl - ;; code offset: 0x279 - 0x27b + ;; code offset: 0x283 - 0x285 (local.get $0) - ;; code offset: 0x27b - 0x27d + ;; code offset: 0x285 - 0x287 (i32.const 2) ) ) ) ) ) - ;; code offset: 0x295 - 0x298 + ;; code offset: 0x29f - 0x2a2 (i32.store - ;; code offset: 0x286 - 0x288 + ;; code offset: 0x290 - 0x292 (local.get $11) - ;; code offset: 0x292 - 0x295 + ;; code offset: 0x29c - 0x29f (i32.load - ;; code offset: 0x290 - 0x292 + ;; code offset: 0x29a - 0x29c (local.tee $15 - ;; code offset: 0x28f - 0x290 + ;; code offset: 0x299 - 0x29a (i32.add - ;; code offset: 0x288 - 0x28a + ;; code offset: 0x292 - 0x294 (local.get $8) - ;; code offset: 0x28e - 0x28f + ;; code offset: 0x298 - 0x299 (i32.shl - ;; code offset: 0x28a - 0x28c + ;; code offset: 0x294 - 0x296 (local.get $1) - ;; code offset: 0x28c - 0x28e + ;; code offset: 0x296 - 0x298 (i32.const 2) ) ) ) ) ) - ;; code offset: 0x29c - 0x29f + ;; code offset: 0x2a6 - 0x2a9 (i32.store - ;; code offset: 0x298 - 0x29a + ;; code offset: 0x2a2 - 0x2a4 (local.get $15) - ;; code offset: 0x29a - 0x29c + ;; code offset: 0x2a4 - 0x2a6 (local.get $14) ) - ;; code offset: 0x2ae - 0x2b0 + ;; code offset: 0x2b8 - 0x2ba (br_if $label8 - ;; code offset: 0x2ad - 0x2ae + ;; code offset: 0x2b7 - 0x2b8 (i32.lt_s - ;; code offset: 0x2a4 - 0x2a6 + ;; code offset: 0x2ae - 0x2b0 (local.tee $0 - ;; code offset: 0x2a3 - 0x2a4 + ;; code offset: 0x2ad - 0x2ae (i32.add - ;; code offset: 0x29f - 0x2a1 + ;; code offset: 0x2a9 - 0x2ab (local.get $0) - ;; code offset: 0x2a1 - 0x2a3 + ;; code offset: 0x2ab - 0x2ad (i32.const 1) ) ) - ;; code offset: 0x2ab - 0x2ad + ;; code offset: 0x2b5 - 0x2b7 (local.tee $1 - ;; code offset: 0x2aa - 0x2ab + ;; code offset: 0x2b4 - 0x2b5 (i32.sub - ;; code offset: 0x2a6 - 0x2a8 + ;; code offset: 0x2b0 - 0x2b2 (local.get $1) - ;; code offset: 0x2a8 - 0x2aa + ;; code offset: 0x2b2 - 0x2b4 (i32.const 1) ) ) @@ -5580,267 +5607,267 @@ file_names[ 4]: ) ) ) - ;; code offset: 0x2bf - 0x2c1 + ;; code offset: 0x2c9 - 0x2cb (local.set $1 - ;; code offset: 0x2bc - 0x2bf + ;; code offset: 0x2c6 - 0x2c9 (i32.load - ;; code offset: 0x2ba - 0x2bc + ;; code offset: 0x2c4 - 0x2c6 (local.tee $0 - ;; code offset: 0x2b9 - 0x2ba + ;; code offset: 0x2c3 - 0x2c4 (i32.add - ;; code offset: 0x2b2 - 0x2b4 + ;; code offset: 0x2bc - 0x2be (local.get $8) - ;; code offset: 0x2b8 - 0x2b9 + ;; code offset: 0x2c2 - 0x2c3 (i32.shl - ;; code offset: 0x2b4 - 0x2b6 + ;; code offset: 0x2be - 0x2c0 (local.get $7) - ;; code offset: 0x2b6 - 0x2b8 + ;; code offset: 0x2c0 - 0x2c2 (i32.const 2) ) ) ) ) ) - ;; code offset: 0x2c5 - 0x2c8 + ;; code offset: 0x2cf - 0x2d2 (i32.store - ;; code offset: 0x2c1 - 0x2c3 + ;; code offset: 0x2cb - 0x2cd (local.get $0) - ;; code offset: 0x2c3 - 0x2c5 + ;; code offset: 0x2cd - 0x2cf (local.get $7) ) - ;; code offset: 0x2cd - 0x2cf + ;; code offset: 0x2d7 - 0x2d9 (local.set $0 - ;; code offset: 0x2cc - 0x2cd + ;; code offset: 0x2d6 - 0x2d7 (i32.add - ;; code offset: 0x2c8 - 0x2ca + ;; code offset: 0x2d2 - 0x2d4 (local.get $10) - ;; code offset: 0x2ca - 0x2cc + ;; code offset: 0x2d4 - 0x2d6 (i32.const 1) ) ) - ;; code offset: 0x2d1 - 0x2d3 + ;; code offset: 0x2db - 0x2dd (local.set $7 - ;; code offset: 0x2cf - 0x2d1 + ;; code offset: 0x2d9 - 0x2db (local.get $1) ) - ;; code offset: 0x2d5 - 0x2d7 + ;; code offset: 0x2df - 0x2e1 (br_if $label9 - ;; code offset: 0x2d3 - 0x2d5 + ;; code offset: 0x2dd - 0x2df (local.get $1) ) ) - ;; code offset: 0x2e2 - 0x2e4 + ;; code offset: 0x2ec - 0x2ee (local.set $5 - ;; code offset: 0x2e1 - 0x2e2 + ;; code offset: 0x2eb - 0x2ec (select - ;; code offset: 0x2d8 - 0x2da + ;; code offset: 0x2e2 - 0x2e4 (local.get $5) - ;; code offset: 0x2da - 0x2dc + ;; code offset: 0x2e4 - 0x2e6 (local.get $0) - ;; code offset: 0x2e0 - 0x2e1 + ;; code offset: 0x2ea - 0x2eb (i32.gt_s - ;; code offset: 0x2dc - 0x2de + ;; code offset: 0x2e6 - 0x2e8 (local.get $5) - ;; code offset: 0x2de - 0x2e0 + ;; code offset: 0x2e8 - 0x2ea (local.get $10) ) ) ) ) - ;; code offset: 0x2ea - 0x2ec - (br_if $block1 - ;; code offset: 0x2e9 - 0x2ea + ;; code offset: 0x2f4 - 0x2f6 + (br_if $block2 + ;; code offset: 0x2f3 - 0x2f4 (i32.ge_s - ;; code offset: 0x2e5 - 0x2e7 + ;; code offset: 0x2ef - 0x2f1 (local.get $2) - ;; code offset: 0x2e7 - 0x2e9 + ;; code offset: 0x2f1 - 0x2f3 (local.get $4) ) ) - ;; code offset: 0x2ec - 0x364 + ;; code offset: 0x2f6 - 0x36e (loop $label12 - ;; code offset: 0x2f0 - 0x2f2 + ;; code offset: 0x2fa - 0x2fc (local.set $1 - ;; code offset: 0x2ee - 0x2f0 + ;; code offset: 0x2f8 - 0x2fa (i32.const 0) ) - ;; code offset: 0x2f7 - 0x323 + ;; code offset: 0x301 - 0x32d (if - ;; code offset: 0x2f6 - 0x2f7 + ;; code offset: 0x300 - 0x301 (i32.gt_s - ;; code offset: 0x2f2 - 0x2f4 + ;; code offset: 0x2fc - 0x2fe (local.get $2) - ;; code offset: 0x2f4 - 0x2f6 + ;; code offset: 0x2fe - 0x300 (i32.const 0) ) (then - ;; code offset: 0x2f9 - 0x31e + ;; code offset: 0x303 - 0x328 (loop $label10 - ;; code offset: 0x313 - 0x316 + ;; code offset: 0x31d - 0x320 (i32.store - ;; code offset: 0x302 - 0x303 + ;; code offset: 0x30c - 0x30d (i32.add - ;; code offset: 0x2fb - 0x2fd + ;; code offset: 0x305 - 0x307 (local.get $3) - ;; code offset: 0x301 - 0x302 + ;; code offset: 0x30b - 0x30c (i32.shl - ;; code offset: 0x2fd - 0x2ff + ;; code offset: 0x307 - 0x309 (local.get $1) - ;; code offset: 0x2ff - 0x301 + ;; code offset: 0x309 - 0x30b (i32.const 2) ) ) - ;; code offset: 0x310 - 0x313 + ;; code offset: 0x31a - 0x31d (i32.load - ;; code offset: 0x30f - 0x310 + ;; code offset: 0x319 - 0x31a (i32.add - ;; code offset: 0x303 - 0x305 + ;; code offset: 0x30d - 0x30f (local.get $3) - ;; code offset: 0x30e - 0x30f + ;; code offset: 0x318 - 0x319 (i32.shl - ;; code offset: 0x30a - 0x30c + ;; code offset: 0x314 - 0x316 (local.tee $1 - ;; code offset: 0x309 - 0x30a + ;; code offset: 0x313 - 0x314 (i32.add - ;; code offset: 0x305 - 0x307 + ;; code offset: 0x30f - 0x311 (local.get $1) - ;; code offset: 0x307 - 0x309 + ;; code offset: 0x311 - 0x313 (i32.const 1) ) ) - ;; code offset: 0x30c - 0x30e + ;; code offset: 0x316 - 0x318 (i32.const 2) ) ) ) ) - ;; code offset: 0x31b - 0x31d + ;; code offset: 0x325 - 0x327 (br_if $label10 - ;; code offset: 0x31a - 0x31b + ;; code offset: 0x324 - 0x325 (i32.ne - ;; code offset: 0x316 - 0x318 + ;; code offset: 0x320 - 0x322 (local.get $1) - ;; code offset: 0x318 - 0x31a + ;; code offset: 0x322 - 0x324 (local.get $2) ) ) ) - ;; code offset: 0x320 - 0x322 + ;; code offset: 0x32a - 0x32c (local.set $1 - ;; code offset: 0x31e - 0x320 + ;; code offset: 0x328 - 0x32a (local.get $2) ) ) ) - ;; code offset: 0x32d - 0x330 + ;; code offset: 0x337 - 0x33a (i32.store - ;; code offset: 0x32a - 0x32b + ;; code offset: 0x334 - 0x335 (i32.add - ;; code offset: 0x323 - 0x325 + ;; code offset: 0x32d - 0x32f (local.get $3) - ;; code offset: 0x329 - 0x32a + ;; code offset: 0x333 - 0x334 (i32.shl - ;; code offset: 0x325 - 0x327 + ;; code offset: 0x32f - 0x331 (local.get $1) - ;; code offset: 0x327 - 0x329 + ;; code offset: 0x331 - 0x333 (i32.const 2) ) ) - ;; code offset: 0x32b - 0x32d + ;; code offset: 0x335 - 0x337 (local.get $6) ) - ;; code offset: 0x344 - 0x347 + ;; code offset: 0x34e - 0x351 (i32.store - ;; code offset: 0x338 - 0x33a + ;; code offset: 0x342 - 0x344 (local.tee $1 - ;; code offset: 0x337 - 0x338 + ;; code offset: 0x341 - 0x342 (i32.add - ;; code offset: 0x330 - 0x332 + ;; code offset: 0x33a - 0x33c (local.get $9) - ;; code offset: 0x336 - 0x337 + ;; code offset: 0x340 - 0x341 (i32.shl - ;; code offset: 0x332 - 0x334 + ;; code offset: 0x33c - 0x33e (local.get $2) - ;; code offset: 0x334 - 0x336 + ;; code offset: 0x33e - 0x340 (i32.const 2) ) ) ) - ;; code offset: 0x343 - 0x344 + ;; code offset: 0x34d - 0x34e (i32.sub - ;; code offset: 0x33f - 0x341 + ;; code offset: 0x349 - 0x34b (local.tee $1 - ;; code offset: 0x33c - 0x33f + ;; code offset: 0x346 - 0x349 (i32.load - ;; code offset: 0x33a - 0x33c + ;; code offset: 0x344 - 0x346 (local.get $1) ) ) - ;; code offset: 0x341 - 0x343 + ;; code offset: 0x34b - 0x34d (i32.const 1) ) ) - ;; code offset: 0x34c - 0x34e + ;; code offset: 0x356 - 0x358 (br_if $label11 - ;; code offset: 0x34b - 0x34c + ;; code offset: 0x355 - 0x356 (i32.gt_s - ;; code offset: 0x347 - 0x349 + ;; code offset: 0x351 - 0x353 (local.get $1) - ;; code offset: 0x349 - 0x34b + ;; code offset: 0x353 - 0x355 (i32.const 1) ) ) - ;; code offset: 0x358 - 0x35a - (br_if $block1 - ;; code offset: 0x357 - 0x358 + ;; code offset: 0x362 - 0x364 + (br_if $block2 + ;; code offset: 0x361 - 0x362 (i32.eq - ;; code offset: 0x353 - 0x355 + ;; code offset: 0x35d - 0x35f (local.tee $2 - ;; code offset: 0x352 - 0x353 + ;; code offset: 0x35c - 0x35d (i32.add - ;; code offset: 0x34e - 0x350 + ;; code offset: 0x358 - 0x35a (local.get $2) - ;; code offset: 0x350 - 0x352 + ;; code offset: 0x35a - 0x35c (i32.const 1) ) ) - ;; code offset: 0x355 - 0x357 + ;; code offset: 0x35f - 0x361 (local.get $4) ) ) - ;; code offset: 0x35f - 0x361 + ;; code offset: 0x369 - 0x36b (local.set $6 - ;; code offset: 0x35c - 0x35f + ;; code offset: 0x366 - 0x369 (i32.load - ;; code offset: 0x35a - 0x35c + ;; code offset: 0x364 - 0x366 (local.get $3) ) ) - ;; code offset: 0x361 - 0x363 + ;; code offset: 0x36b - 0x36d (br $label12) ) - ;; code offset: 0x364 - 0x365 + ;; code offset: 0x36e - 0x36f (unreachable) ) - ;; code offset: 0x366 - 0x367 + ;; code offset: 0x370 - 0x371 (unreachable) ) - ;; code offset: 0x36a - 0x36c + ;; code offset: 0x374 - 0x376 (call $free - ;; code offset: 0x368 - 0x36a + ;; code offset: 0x372 - 0x374 (local.get $3) ) - ;; code offset: 0x36e - 0x370 + ;; code offset: 0x378 - 0x37a (call $free - ;; code offset: 0x36c - 0x36e + ;; code offset: 0x376 - 0x378 (local.get $8) ) - ;; code offset: 0x372 - 0x374 + ;; code offset: 0x37c - 0x37e (call $free - ;; code offset: 0x370 - 0x372 + ;; code offset: 0x37a - 0x37c (local.get $9) ) - ;; code offset: 0x374 - 0x376 + ;; code offset: 0x37e - 0x380 (local.get $5) ) (func $main (param $0 i32) (param $1 i32) (result i32) @@ -5853,393 +5880,393 @@ file_names[ 4]: (local $8 i32) (local $scratch i32) (local $scratch_10 i32) - ;; code offset: 0x38f - 0x391 + ;; code offset: 0x399 - 0x39b (global.set $global$0 - ;; code offset: 0x38d - 0x38f + ;; code offset: 0x397 - 0x399 (local.tee $8 - ;; code offset: 0x38c - 0x38d + ;; code offset: 0x396 - 0x397 (i32.sub - ;; code offset: 0x388 - 0x38a + ;; code offset: 0x392 - 0x394 (global.get $global$0) - ;; code offset: 0x38a - 0x38c + ;; code offset: 0x394 - 0x396 (i32.const 32) ) ) ) - ;; code offset: 0x391 - 0x64e + ;; code offset: 0x39b - 0x658 (block $block1 - ;; code offset: 0x393 - 0x3b8 + ;; code offset: 0x39d - 0x3c2 (block $block - ;; code offset: 0x39a - 0x3ab + ;; code offset: 0x3a4 - 0x3b5 (if - ;; code offset: 0x399 - 0x39a + ;; code offset: 0x3a3 - 0x3a4 (i32.ge_s - ;; code offset: 0x395 - 0x397 + ;; code offset: 0x39f - 0x3a1 (local.get $0) - ;; code offset: 0x397 - 0x399 + ;; code offset: 0x3a1 - 0x3a3 (i32.const 2) ) (then - ;; code offset: 0x3a8 - 0x3aa + ;; code offset: 0x3b2 - 0x3b4 (br_if $block - ;; code offset: 0x3a7 - 0x3a8 + ;; code offset: 0x3b1 - 0x3b2 (i32.gt_s - ;; code offset: 0x3a3 - 0x3a5 + ;; code offset: 0x3ad - 0x3af (local.tee $3 - ;; code offset: 0x3a1 - 0x3a3 + ;; code offset: 0x3ab - 0x3ad (call $atoi - ;; code offset: 0x39e - 0x3a1 + ;; code offset: 0x3a8 - 0x3ab (i32.load offset=4 - ;; code offset: 0x39c - 0x39e + ;; code offset: 0x3a6 - 0x3a8 (local.get $1) ) ) ) - ;; code offset: 0x3a5 - 0x3a7 + ;; code offset: 0x3af - 0x3b1 (i32.const 0) ) ) ) ) - ;; code offset: 0x3b0 - 0x3b1 + ;; code offset: 0x3ba - 0x3bb (drop - ;; code offset: 0x3ae - 0x3b0 + ;; code offset: 0x3b8 - 0x3ba (call $puts - ;; code offset: 0x3ab - 0x3ae + ;; code offset: 0x3b5 - 0x3b8 (i32.const 1050) ) ) - ;; code offset: 0x3b3 - 0x3b5 + ;; code offset: 0x3bd - 0x3bf (local.set $5 - ;; code offset: 0x3b1 - 0x3b3 + ;; code offset: 0x3bb - 0x3bd (i32.const 1) ) - ;; code offset: 0x3b5 - 0x3b7 + ;; code offset: 0x3bf - 0x3c1 (br $block1) ) - ;; code offset: 0x3bd - 0x3fb + ;; code offset: 0x3c7 - 0x405 (if - ;; code offset: 0x3bc - 0x3bd + ;; code offset: 0x3c6 - 0x3c7 (i32.ne - ;; code offset: 0x3b8 - 0x3ba + ;; code offset: 0x3c2 - 0x3c4 (local.get $3) - ;; code offset: 0x3ba - 0x3bc + ;; code offset: 0x3c4 - 0x3c6 (i32.const 1) ) (then - ;; code offset: 0x3c4 - 0x3c6 + ;; code offset: 0x3ce - 0x3d0 (local.set $2 - ;; code offset: 0x3c3 - 0x3c4 + ;; code offset: 0x3cd - 0x3ce (i32.sub - ;; code offset: 0x3bf - 0x3c1 + ;; code offset: 0x3c9 - 0x3cb (local.get $3) - ;; code offset: 0x3c1 - 0x3c3 + ;; code offset: 0x3cb - 0x3cd (i32.const 1) ) ) - ;; code offset: 0x3c8 - 0x3ca + ;; code offset: 0x3d2 - 0x3d4 (local.set $1 - ;; code offset: 0x3c6 - 0x3c8 + ;; code offset: 0x3d0 - 0x3d2 (i32.const 0) ) - ;; code offset: 0x3cc - 0x3ce + ;; code offset: 0x3d6 - 0x3d8 (local.set $0 - ;; code offset: 0x3ca - 0x3cc + ;; code offset: 0x3d4 - 0x3d6 (i32.const 0) ) - ;; code offset: 0x3ce - 0x3fa + ;; code offset: 0x3d8 - 0x404 (loop $label - ;; code offset: 0x3d8 - 0x3db + ;; code offset: 0x3e2 - 0x3e5 (i32.store offset=8 - ;; code offset: 0x3d4 - 0x3d6 + ;; code offset: 0x3de - 0x3e0 (local.tee $4 - ;; code offset: 0x3d2 - 0x3d4 + ;; code offset: 0x3dc - 0x3de (call $malloc - ;; code offset: 0x3d0 - 0x3d2 + ;; code offset: 0x3da - 0x3dc (i32.const 12) ) ) - ;; code offset: 0x3d6 - 0x3d8 + ;; code offset: 0x3e0 - 0x3e2 (local.get $1) ) - ;; code offset: 0x3df - 0x3e2 + ;; code offset: 0x3e9 - 0x3ec (i32.store offset=4 - ;; code offset: 0x3db - 0x3dd + ;; code offset: 0x3e5 - 0x3e7 (local.get $4) - ;; code offset: 0x3dd - 0x3df + ;; code offset: 0x3e7 - 0x3e9 (local.get $3) ) - ;; code offset: 0x3e6 - 0x3e9 + ;; code offset: 0x3f0 - 0x3f3 (i32.store - ;; code offset: 0x3e2 - 0x3e4 + ;; code offset: 0x3ec - 0x3ee (local.get $4) - ;; code offset: 0x3e4 - 0x3e6 + ;; code offset: 0x3ee - 0x3f0 (local.get $0) ) - ;; code offset: 0x3eb - 0x3ed + ;; code offset: 0x3f5 - 0x3f7 (local.set $1 - ;; code offset: 0x3e9 - 0x3eb + ;; code offset: 0x3f3 - 0x3f5 (local.get $4) ) - ;; code offset: 0x3f7 - 0x3f9 + ;; code offset: 0x401 - 0x403 (br_if $label - ;; code offset: 0x3f6 - 0x3f7 + ;; code offset: 0x400 - 0x401 (i32.ne - ;; code offset: 0x3f2 - 0x3f4 + ;; code offset: 0x3fc - 0x3fe (local.tee $0 - ;; code offset: 0x3f1 - 0x3f2 + ;; code offset: 0x3fb - 0x3fc (i32.add - ;; code offset: 0x3ed - 0x3ef + ;; code offset: 0x3f7 - 0x3f9 (local.get $0) - ;; code offset: 0x3ef - 0x3f1 + ;; code offset: 0x3f9 - 0x3fb (i32.const 1) ) ) - ;; code offset: 0x3f4 - 0x3f6 + ;; code offset: 0x3fe - 0x400 (local.get $2) ) ) ) ) ) - ;; code offset: 0x3fd - 0x3ff + ;; code offset: 0x407 - 0x409 (local.set $0 - ;; code offset: 0x3fb - 0x3fd + ;; code offset: 0x405 - 0x407 (i32.const 0) ) - ;; code offset: 0x408 - 0x40a + ;; code offset: 0x412 - 0x414 (local.set $1 - ;; code offset: 0x406 - 0x408 + ;; code offset: 0x410 - 0x412 (call $malloc - ;; code offset: 0x404 - 0x406 + ;; code offset: 0x40e - 0x410 (local.tee $2 - ;; code offset: 0x403 - 0x404 + ;; code offset: 0x40d - 0x40e (i32.shl - ;; code offset: 0x3ff - 0x401 + ;; code offset: 0x409 - 0x40b (local.get $3) - ;; code offset: 0x401 - 0x403 + ;; code offset: 0x40b - 0x40d (i32.const 2) ) ) ) ) - ;; code offset: 0x40e - 0x410 + ;; code offset: 0x418 - 0x41a (local.set $5 - ;; code offset: 0x40c - 0x40e + ;; code offset: 0x416 - 0x418 (call $malloc - ;; code offset: 0x40a - 0x40c + ;; code offset: 0x414 - 0x416 (local.get $2) ) ) - ;; code offset: 0x410 - 0x5fa + ;; code offset: 0x41a - 0x604 (block $block4 - ;; code offset: 0x412 - 0x53e + ;; code offset: 0x41c - 0x548 (block $block3 - ;; code offset: 0x414 - 0x44f + ;; code offset: 0x41e - 0x459 (block $block2 - ;; code offset: 0x41b - 0x444 + ;; code offset: 0x425 - 0x44e (if - ;; code offset: 0x41a - 0x41b + ;; code offset: 0x424 - 0x425 (i32.gt_s - ;; code offset: 0x416 - 0x418 + ;; code offset: 0x420 - 0x422 (local.get $3) - ;; code offset: 0x418 - 0x41a + ;; code offset: 0x422 - 0x424 (i32.const 0) ) (then - ;; code offset: 0x41d - 0x439 + ;; code offset: 0x427 - 0x443 (loop $label1 - ;; code offset: 0x429 - 0x42c + ;; code offset: 0x433 - 0x436 (i32.store - ;; code offset: 0x426 - 0x427 + ;; code offset: 0x430 - 0x431 (i32.add - ;; code offset: 0x41f - 0x421 + ;; code offset: 0x429 - 0x42b (local.get $1) - ;; code offset: 0x425 - 0x426 + ;; code offset: 0x42f - 0x430 (i32.shl - ;; code offset: 0x421 - 0x423 + ;; code offset: 0x42b - 0x42d (local.get $0) - ;; code offset: 0x423 - 0x425 + ;; code offset: 0x42d - 0x42f (i32.const 2) ) ) - ;; code offset: 0x427 - 0x429 + ;; code offset: 0x431 - 0x433 (local.get $0) ) - ;; code offset: 0x436 - 0x438 + ;; code offset: 0x440 - 0x442 (br_if $label1 - ;; code offset: 0x435 - 0x436 + ;; code offset: 0x43f - 0x440 (i32.ne - ;; code offset: 0x431 - 0x433 + ;; code offset: 0x43b - 0x43d (local.tee $0 - ;; code offset: 0x430 - 0x431 + ;; code offset: 0x43a - 0x43b (i32.add - ;; code offset: 0x42c - 0x42e + ;; code offset: 0x436 - 0x438 (local.get $0) - ;; code offset: 0x42e - 0x430 + ;; code offset: 0x438 - 0x43a (i32.const 1) ) ) - ;; code offset: 0x433 - 0x435 + ;; code offset: 0x43d - 0x43f (local.get $3) ) ) ) - ;; code offset: 0x43b - 0x43d + ;; code offset: 0x445 - 0x447 (local.set $6 - ;; code offset: 0x439 - 0x43b + ;; code offset: 0x443 - 0x445 (i32.const 30) ) - ;; code offset: 0x43f - 0x441 + ;; code offset: 0x449 - 0x44b (local.set $2 - ;; code offset: 0x43d - 0x43f + ;; code offset: 0x447 - 0x449 (local.get $3) ) - ;; code offset: 0x441 - 0x443 + ;; code offset: 0x44b - 0x44d (br $block2) ) ) - ;; code offset: 0x446 - 0x448 + ;; code offset: 0x450 - 0x452 (local.set $6 - ;; code offset: 0x444 - 0x446 + ;; code offset: 0x44e - 0x450 (i32.const 30) ) - ;; code offset: 0x44a - 0x44c + ;; code offset: 0x454 - 0x456 (local.set $2 - ;; code offset: 0x448 - 0x44a + ;; code offset: 0x452 - 0x454 (local.get $3) ) - ;; code offset: 0x44c - 0x44e + ;; code offset: 0x456 - 0x458 (br $block3) ) - ;; code offset: 0x44f - 0x53b + ;; code offset: 0x459 - 0x545 (loop $label6 - ;; code offset: 0x453 - 0x455 + ;; code offset: 0x45d - 0x45f (local.set $0 - ;; code offset: 0x451 - 0x453 + ;; code offset: 0x45b - 0x45d (i32.const 0) ) - ;; code offset: 0x455 - 0x482 + ;; code offset: 0x45f - 0x48c (loop $label2 - ;; code offset: 0x467 - 0x46a + ;; code offset: 0x471 - 0x474 (i32.store offset=16 - ;; code offset: 0x457 - 0x459 + ;; code offset: 0x461 - 0x463 (local.get $8) - ;; code offset: 0x466 - 0x467 + ;; code offset: 0x470 - 0x471 (i32.add - ;; code offset: 0x461 - 0x464 + ;; code offset: 0x46b - 0x46e (i32.load - ;; code offset: 0x460 - 0x461 + ;; code offset: 0x46a - 0x46b (i32.add - ;; code offset: 0x459 - 0x45b + ;; code offset: 0x463 - 0x465 (local.get $1) - ;; code offset: 0x45f - 0x460 + ;; code offset: 0x469 - 0x46a (i32.shl - ;; code offset: 0x45b - 0x45d + ;; code offset: 0x465 - 0x467 (local.get $0) - ;; code offset: 0x45d - 0x45f + ;; code offset: 0x467 - 0x469 (i32.const 2) ) ) ) - ;; code offset: 0x464 - 0x466 + ;; code offset: 0x46e - 0x470 (i32.const 1) ) ) - ;; code offset: 0x474 - 0x475 + ;; code offset: 0x47e - 0x47f (drop - ;; code offset: 0x472 - 0x474 + ;; code offset: 0x47c - 0x47e (call $iprintf - ;; code offset: 0x46a - 0x46d + ;; code offset: 0x474 - 0x477 (i32.const 1047) - ;; code offset: 0x471 - 0x472 + ;; code offset: 0x47b - 0x47c (i32.add - ;; code offset: 0x46d - 0x46f + ;; code offset: 0x477 - 0x479 (local.get $8) - ;; code offset: 0x46f - 0x471 + ;; code offset: 0x479 - 0x47b (i32.const 16) ) ) ) - ;; code offset: 0x47f - 0x481 + ;; code offset: 0x489 - 0x48b (br_if $label2 - ;; code offset: 0x47e - 0x47f + ;; code offset: 0x488 - 0x489 (i32.ne - ;; code offset: 0x47a - 0x47c + ;; code offset: 0x484 - 0x486 (local.tee $0 - ;; code offset: 0x479 - 0x47a + ;; code offset: 0x483 - 0x484 (i32.add - ;; code offset: 0x475 - 0x477 + ;; code offset: 0x47f - 0x481 (local.get $0) - ;; code offset: 0x477 - 0x479 + ;; code offset: 0x481 - 0x483 (i32.const 1) ) ) - ;; code offset: 0x47c - 0x47e + ;; code offset: 0x486 - 0x488 (local.get $3) ) ) ) - ;; code offset: 0x486 - 0x487 + ;; code offset: 0x490 - 0x491 (drop - ;; code offset: 0x484 - 0x486 + ;; code offset: 0x48e - 0x490 (call $putchar - ;; code offset: 0x482 - 0x484 + ;; code offset: 0x48c - 0x48e (i32.const 10) ) ) - ;; code offset: 0x48c - 0x4af + ;; code offset: 0x496 - 0x4b9 (if - ;; code offset: 0x48b - 0x48c + ;; code offset: 0x495 - 0x496 (i32.gt_s - ;; code offset: 0x487 - 0x489 + ;; code offset: 0x491 - 0x493 (local.get $2) - ;; code offset: 0x489 - 0x48b + ;; code offset: 0x493 - 0x495 (i32.const 1) ) (then - ;; code offset: 0x48e - 0x4ae + ;; code offset: 0x498 - 0x4b8 (loop $label3 - ;; code offset: 0x49f - 0x4a2 + ;; code offset: 0x4a9 - 0x4ac (i32.store - ;; code offset: 0x49c - 0x49d + ;; code offset: 0x4a6 - 0x4a7 (i32.add - ;; code offset: 0x490 - 0x492 + ;; code offset: 0x49a - 0x49c (local.get $5) - ;; code offset: 0x49b - 0x49c + ;; code offset: 0x4a5 - 0x4a6 (i32.shl - ;; code offset: 0x497 - 0x499 + ;; code offset: 0x4a1 - 0x4a3 (local.tee $0 - ;; code offset: 0x496 - 0x497 + ;; code offset: 0x4a0 - 0x4a1 (i32.sub - ;; code offset: 0x492 - 0x494 + ;; code offset: 0x49c - 0x49e (local.get $2) - ;; code offset: 0x494 - 0x496 + ;; code offset: 0x49e - 0x4a0 (i32.const 1) ) ) - ;; code offset: 0x499 - 0x49b + ;; code offset: 0x4a3 - 0x4a5 (i32.const 2) ) ) - ;; code offset: 0x49d - 0x49f + ;; code offset: 0x4a7 - 0x4a9 (local.get $2) ) - ;; code offset: 0x4ab - 0x4ad + ;; code offset: 0x4b5 - 0x4b7 (br_if $label3 (block (result i32) (local.set $scratch - ;; code offset: 0x4a6 - 0x4a7 + ;; code offset: 0x4b0 - 0x4b1 (i32.gt_s - ;; code offset: 0x4a2 - 0x4a4 + ;; code offset: 0x4ac - 0x4ae (local.get $2) - ;; code offset: 0x4a4 - 0x4a6 + ;; code offset: 0x4ae - 0x4b0 (i32.const 2) ) ) - ;; code offset: 0x4a9 - 0x4ab + ;; code offset: 0x4b3 - 0x4b5 (local.set $2 - ;; code offset: 0x4a7 - 0x4a9 + ;; code offset: 0x4b1 - 0x4b3 (local.get $0) ) (local.get $scratch) @@ -6248,261 +6275,261 @@ file_names[ 4]: ) ) ) - ;; code offset: 0x4b4 - 0x4b6 + ;; code offset: 0x4be - 0x4c0 (br_if $block4 - ;; code offset: 0x4b3 - 0x4b4 + ;; code offset: 0x4bd - 0x4be (i32.eq - ;; code offset: 0x4af - 0x4b1 + ;; code offset: 0x4b9 - 0x4bb (local.get $2) - ;; code offset: 0x4b1 - 0x4b3 + ;; code offset: 0x4bb - 0x4bd (local.get $3) ) ) - ;; code offset: 0x4bb - 0x4bd + ;; code offset: 0x4c5 - 0x4c7 (local.set $6 - ;; code offset: 0x4ba - 0x4bb + ;; code offset: 0x4c4 - 0x4c5 (i32.sub - ;; code offset: 0x4b6 - 0x4b8 + ;; code offset: 0x4c0 - 0x4c2 (local.get $6) - ;; code offset: 0x4b8 - 0x4ba + ;; code offset: 0x4c2 - 0x4c4 (i32.const 1) ) ) - ;; code offset: 0x4bd - 0x536 + ;; code offset: 0x4c7 - 0x540 (loop $label5 - ;; code offset: 0x4c1 - 0x4c3 + ;; code offset: 0x4cb - 0x4cd (local.set $0 - ;; code offset: 0x4bf - 0x4c1 + ;; code offset: 0x4c9 - 0x4cb (i32.const 0) ) - ;; code offset: 0x4c8 - 0x4ca + ;; code offset: 0x4d2 - 0x4d4 (local.set $7 - ;; code offset: 0x4c5 - 0x4c8 + ;; code offset: 0x4cf - 0x4d2 (i32.load - ;; code offset: 0x4c3 - 0x4c5 + ;; code offset: 0x4cd - 0x4cf (local.get $1) ) ) - ;; code offset: 0x4cf - 0x4fb + ;; code offset: 0x4d9 - 0x505 (if - ;; code offset: 0x4ce - 0x4cf + ;; code offset: 0x4d8 - 0x4d9 (i32.gt_s - ;; code offset: 0x4ca - 0x4cc + ;; code offset: 0x4d4 - 0x4d6 (local.get $2) - ;; code offset: 0x4cc - 0x4ce + ;; code offset: 0x4d6 - 0x4d8 (i32.const 0) ) (then - ;; code offset: 0x4d1 - 0x4f6 + ;; code offset: 0x4db - 0x500 (loop $label4 - ;; code offset: 0x4eb - 0x4ee + ;; code offset: 0x4f5 - 0x4f8 (i32.store - ;; code offset: 0x4da - 0x4db + ;; code offset: 0x4e4 - 0x4e5 (i32.add - ;; code offset: 0x4d3 - 0x4d5 + ;; code offset: 0x4dd - 0x4df (local.get $1) - ;; code offset: 0x4d9 - 0x4da + ;; code offset: 0x4e3 - 0x4e4 (i32.shl - ;; code offset: 0x4d5 - 0x4d7 + ;; code offset: 0x4df - 0x4e1 (local.get $0) - ;; code offset: 0x4d7 - 0x4d9 + ;; code offset: 0x4e1 - 0x4e3 (i32.const 2) ) ) - ;; code offset: 0x4e8 - 0x4eb + ;; code offset: 0x4f2 - 0x4f5 (i32.load - ;; code offset: 0x4e7 - 0x4e8 + ;; code offset: 0x4f1 - 0x4f2 (i32.add - ;; code offset: 0x4db - 0x4dd + ;; code offset: 0x4e5 - 0x4e7 (local.get $1) - ;; code offset: 0x4e6 - 0x4e7 + ;; code offset: 0x4f0 - 0x4f1 (i32.shl - ;; code offset: 0x4e2 - 0x4e4 + ;; code offset: 0x4ec - 0x4ee (local.tee $0 - ;; code offset: 0x4e1 - 0x4e2 + ;; code offset: 0x4eb - 0x4ec (i32.add - ;; code offset: 0x4dd - 0x4df + ;; code offset: 0x4e7 - 0x4e9 (local.get $0) - ;; code offset: 0x4df - 0x4e1 + ;; code offset: 0x4e9 - 0x4eb (i32.const 1) ) ) - ;; code offset: 0x4e4 - 0x4e6 + ;; code offset: 0x4ee - 0x4f0 (i32.const 2) ) ) ) ) - ;; code offset: 0x4f3 - 0x4f5 + ;; code offset: 0x4fd - 0x4ff (br_if $label4 - ;; code offset: 0x4f2 - 0x4f3 + ;; code offset: 0x4fc - 0x4fd (i32.ne - ;; code offset: 0x4ee - 0x4f0 + ;; code offset: 0x4f8 - 0x4fa (local.get $0) - ;; code offset: 0x4f0 - 0x4f2 + ;; code offset: 0x4fa - 0x4fc (local.get $2) ) ) ) - ;; code offset: 0x4f8 - 0x4fa + ;; code offset: 0x502 - 0x504 (local.set $0 - ;; code offset: 0x4f6 - 0x4f8 + ;; code offset: 0x500 - 0x502 (local.get $2) ) ) ) - ;; code offset: 0x505 - 0x508 + ;; code offset: 0x50f - 0x512 (i32.store - ;; code offset: 0x502 - 0x503 + ;; code offset: 0x50c - 0x50d (i32.add - ;; code offset: 0x4fb - 0x4fd + ;; code offset: 0x505 - 0x507 (local.get $1) - ;; code offset: 0x501 - 0x502 + ;; code offset: 0x50b - 0x50c (i32.shl - ;; code offset: 0x4fd - 0x4ff + ;; code offset: 0x507 - 0x509 (local.get $0) - ;; code offset: 0x4ff - 0x501 + ;; code offset: 0x509 - 0x50b (i32.const 2) ) ) - ;; code offset: 0x503 - 0x505 + ;; code offset: 0x50d - 0x50f (local.get $7) ) - ;; code offset: 0x51c - 0x51f + ;; code offset: 0x526 - 0x529 (i32.store - ;; code offset: 0x510 - 0x512 + ;; code offset: 0x51a - 0x51c (local.tee $0 - ;; code offset: 0x50f - 0x510 + ;; code offset: 0x519 - 0x51a (i32.add - ;; code offset: 0x508 - 0x50a + ;; code offset: 0x512 - 0x514 (local.get $5) - ;; code offset: 0x50e - 0x50f + ;; code offset: 0x518 - 0x519 (i32.shl - ;; code offset: 0x50a - 0x50c + ;; code offset: 0x514 - 0x516 (local.get $2) - ;; code offset: 0x50c - 0x50e + ;; code offset: 0x516 - 0x518 (i32.const 2) ) ) ) - ;; code offset: 0x51b - 0x51c + ;; code offset: 0x525 - 0x526 (i32.sub - ;; code offset: 0x517 - 0x519 + ;; code offset: 0x521 - 0x523 (local.tee $0 - ;; code offset: 0x514 - 0x517 + ;; code offset: 0x51e - 0x521 (i32.load - ;; code offset: 0x512 - 0x514 + ;; code offset: 0x51c - 0x51e (local.get $0) ) ) - ;; code offset: 0x519 - 0x51b + ;; code offset: 0x523 - 0x525 (i32.const 1) ) ) - ;; code offset: 0x524 - 0x535 + ;; code offset: 0x52e - 0x53f (if - ;; code offset: 0x523 - 0x524 + ;; code offset: 0x52d - 0x52e (i32.le_s - ;; code offset: 0x51f - 0x521 + ;; code offset: 0x529 - 0x52b (local.get $0) - ;; code offset: 0x521 - 0x523 + ;; code offset: 0x52b - 0x52d (i32.const 1) ) (then - ;; code offset: 0x530 - 0x532 + ;; code offset: 0x53a - 0x53c (br_if $label5 - ;; code offset: 0x52f - 0x530 + ;; code offset: 0x539 - 0x53a (i32.ne - ;; code offset: 0x52b - 0x52d + ;; code offset: 0x535 - 0x537 (local.tee $2 - ;; code offset: 0x52a - 0x52b + ;; code offset: 0x534 - 0x535 (i32.add - ;; code offset: 0x526 - 0x528 + ;; code offset: 0x530 - 0x532 (local.get $2) - ;; code offset: 0x528 - 0x52a + ;; code offset: 0x532 - 0x534 (i32.const 1) ) ) - ;; code offset: 0x52d - 0x52f + ;; code offset: 0x537 - 0x539 (local.get $3) ) ) - ;; code offset: 0x532 - 0x534 + ;; code offset: 0x53c - 0x53e (br $block4) ) ) ) - ;; code offset: 0x538 - 0x53a + ;; code offset: 0x542 - 0x544 (br_if $label6 - ;; code offset: 0x536 - 0x538 + ;; code offset: 0x540 - 0x542 (local.get $6) ) ) - ;; code offset: 0x53b - 0x53d + ;; code offset: 0x545 - 0x547 (br $block4) ) - ;; code offset: 0x53e - 0x5f9 + ;; code offset: 0x548 - 0x603 (loop $label10 - ;; code offset: 0x544 - 0x545 + ;; code offset: 0x54e - 0x54f (drop - ;; code offset: 0x542 - 0x544 + ;; code offset: 0x54c - 0x54e (call $putchar - ;; code offset: 0x540 - 0x542 + ;; code offset: 0x54a - 0x54c (i32.const 10) ) ) - ;; code offset: 0x54a - 0x56d + ;; code offset: 0x554 - 0x577 (if - ;; code offset: 0x549 - 0x54a + ;; code offset: 0x553 - 0x554 (i32.gt_s - ;; code offset: 0x545 - 0x547 + ;; code offset: 0x54f - 0x551 (local.get $2) - ;; code offset: 0x547 - 0x549 + ;; code offset: 0x551 - 0x553 (i32.const 1) ) (then - ;; code offset: 0x54c - 0x56c + ;; code offset: 0x556 - 0x576 (loop $label7 - ;; code offset: 0x55d - 0x560 + ;; code offset: 0x567 - 0x56a (i32.store - ;; code offset: 0x55a - 0x55b + ;; code offset: 0x564 - 0x565 (i32.add - ;; code offset: 0x54e - 0x550 + ;; code offset: 0x558 - 0x55a (local.get $5) - ;; code offset: 0x559 - 0x55a + ;; code offset: 0x563 - 0x564 (i32.shl - ;; code offset: 0x555 - 0x557 + ;; code offset: 0x55f - 0x561 (local.tee $0 - ;; code offset: 0x554 - 0x555 + ;; code offset: 0x55e - 0x55f (i32.sub - ;; code offset: 0x550 - 0x552 + ;; code offset: 0x55a - 0x55c (local.get $2) - ;; code offset: 0x552 - 0x554 + ;; code offset: 0x55c - 0x55e (i32.const 1) ) ) - ;; code offset: 0x557 - 0x559 + ;; code offset: 0x561 - 0x563 (i32.const 2) ) ) - ;; code offset: 0x55b - 0x55d + ;; code offset: 0x565 - 0x567 (local.get $2) ) - ;; code offset: 0x569 - 0x56b + ;; code offset: 0x573 - 0x575 (br_if $label7 (block (result i32) (local.set $scratch_10 - ;; code offset: 0x564 - 0x565 + ;; code offset: 0x56e - 0x56f (i32.gt_s - ;; code offset: 0x560 - 0x562 + ;; code offset: 0x56a - 0x56c (local.get $2) - ;; code offset: 0x562 - 0x564 + ;; code offset: 0x56c - 0x56e (i32.const 2) ) ) - ;; code offset: 0x567 - 0x569 + ;; code offset: 0x571 - 0x573 (local.set $2 - ;; code offset: 0x565 - 0x567 + ;; code offset: 0x56f - 0x571 (local.get $0) ) (local.get $scratch_10) @@ -6511,318 +6538,318 @@ file_names[ 4]: ) ) ) - ;; code offset: 0x572 - 0x574 + ;; code offset: 0x57c - 0x57e (br_if $block4 - ;; code offset: 0x571 - 0x572 + ;; code offset: 0x57b - 0x57c (i32.eq - ;; code offset: 0x56d - 0x56f + ;; code offset: 0x577 - 0x579 (local.get $2) - ;; code offset: 0x56f - 0x571 + ;; code offset: 0x579 - 0x57b (local.get $3) ) ) - ;; code offset: 0x579 - 0x57b + ;; code offset: 0x583 - 0x585 (local.set $6 - ;; code offset: 0x578 - 0x579 + ;; code offset: 0x582 - 0x583 (i32.sub - ;; code offset: 0x574 - 0x576 + ;; code offset: 0x57e - 0x580 (local.get $6) - ;; code offset: 0x576 - 0x578 + ;; code offset: 0x580 - 0x582 (i32.const 1) ) ) - ;; code offset: 0x57b - 0x5f4 + ;; code offset: 0x585 - 0x5fe (loop $label9 - ;; code offset: 0x582 - 0x584 + ;; code offset: 0x58c - 0x58e (local.set $7 - ;; code offset: 0x57f - 0x582 + ;; code offset: 0x589 - 0x58c (i32.load - ;; code offset: 0x57d - 0x57f + ;; code offset: 0x587 - 0x589 (local.get $1) ) ) - ;; code offset: 0x586 - 0x588 + ;; code offset: 0x590 - 0x592 (local.set $0 - ;; code offset: 0x584 - 0x586 + ;; code offset: 0x58e - 0x590 (i32.const 0) ) - ;; code offset: 0x58d - 0x5b9 + ;; code offset: 0x597 - 0x5c3 (if - ;; code offset: 0x58c - 0x58d + ;; code offset: 0x596 - 0x597 (i32.gt_s - ;; code offset: 0x588 - 0x58a + ;; code offset: 0x592 - 0x594 (local.get $2) - ;; code offset: 0x58a - 0x58c + ;; code offset: 0x594 - 0x596 (i32.const 0) ) (then - ;; code offset: 0x58f - 0x5b4 + ;; code offset: 0x599 - 0x5be (loop $label8 - ;; code offset: 0x5a9 - 0x5ac + ;; code offset: 0x5b3 - 0x5b6 (i32.store - ;; code offset: 0x598 - 0x599 + ;; code offset: 0x5a2 - 0x5a3 (i32.add - ;; code offset: 0x591 - 0x593 + ;; code offset: 0x59b - 0x59d (local.get $1) - ;; code offset: 0x597 - 0x598 + ;; code offset: 0x5a1 - 0x5a2 (i32.shl - ;; code offset: 0x593 - 0x595 + ;; code offset: 0x59d - 0x59f (local.get $0) - ;; code offset: 0x595 - 0x597 + ;; code offset: 0x59f - 0x5a1 (i32.const 2) ) ) - ;; code offset: 0x5a6 - 0x5a9 + ;; code offset: 0x5b0 - 0x5b3 (i32.load - ;; code offset: 0x5a5 - 0x5a6 + ;; code offset: 0x5af - 0x5b0 (i32.add - ;; code offset: 0x599 - 0x59b + ;; code offset: 0x5a3 - 0x5a5 (local.get $1) - ;; code offset: 0x5a4 - 0x5a5 + ;; code offset: 0x5ae - 0x5af (i32.shl - ;; code offset: 0x5a0 - 0x5a2 + ;; code offset: 0x5aa - 0x5ac (local.tee $0 - ;; code offset: 0x59f - 0x5a0 + ;; code offset: 0x5a9 - 0x5aa (i32.add - ;; code offset: 0x59b - 0x59d + ;; code offset: 0x5a5 - 0x5a7 (local.get $0) - ;; code offset: 0x59d - 0x59f + ;; code offset: 0x5a7 - 0x5a9 (i32.const 1) ) ) - ;; code offset: 0x5a2 - 0x5a4 + ;; code offset: 0x5ac - 0x5ae (i32.const 2) ) ) ) ) - ;; code offset: 0x5b1 - 0x5b3 + ;; code offset: 0x5bb - 0x5bd (br_if $label8 - ;; code offset: 0x5b0 - 0x5b1 + ;; code offset: 0x5ba - 0x5bb (i32.ne - ;; code offset: 0x5ac - 0x5ae + ;; code offset: 0x5b6 - 0x5b8 (local.get $0) - ;; code offset: 0x5ae - 0x5b0 + ;; code offset: 0x5b8 - 0x5ba (local.get $2) ) ) ) - ;; code offset: 0x5b6 - 0x5b8 + ;; code offset: 0x5c0 - 0x5c2 (local.set $0 - ;; code offset: 0x5b4 - 0x5b6 + ;; code offset: 0x5be - 0x5c0 (local.get $2) ) ) ) - ;; code offset: 0x5c3 - 0x5c6 + ;; code offset: 0x5cd - 0x5d0 (i32.store - ;; code offset: 0x5c0 - 0x5c1 + ;; code offset: 0x5ca - 0x5cb (i32.add - ;; code offset: 0x5b9 - 0x5bb + ;; code offset: 0x5c3 - 0x5c5 (local.get $1) - ;; code offset: 0x5bf - 0x5c0 + ;; code offset: 0x5c9 - 0x5ca (i32.shl - ;; code offset: 0x5bb - 0x5bd + ;; code offset: 0x5c5 - 0x5c7 (local.get $0) - ;; code offset: 0x5bd - 0x5bf + ;; code offset: 0x5c7 - 0x5c9 (i32.const 2) ) ) - ;; code offset: 0x5c1 - 0x5c3 + ;; code offset: 0x5cb - 0x5cd (local.get $7) ) - ;; code offset: 0x5da - 0x5dd + ;; code offset: 0x5e4 - 0x5e7 (i32.store - ;; code offset: 0x5ce - 0x5d0 + ;; code offset: 0x5d8 - 0x5da (local.tee $0 - ;; code offset: 0x5cd - 0x5ce + ;; code offset: 0x5d7 - 0x5d8 (i32.add - ;; code offset: 0x5c6 - 0x5c8 + ;; code offset: 0x5d0 - 0x5d2 (local.get $5) - ;; code offset: 0x5cc - 0x5cd + ;; code offset: 0x5d6 - 0x5d7 (i32.shl - ;; code offset: 0x5c8 - 0x5ca + ;; code offset: 0x5d2 - 0x5d4 (local.get $2) - ;; code offset: 0x5ca - 0x5cc + ;; code offset: 0x5d4 - 0x5d6 (i32.const 2) ) ) ) - ;; code offset: 0x5d9 - 0x5da + ;; code offset: 0x5e3 - 0x5e4 (i32.sub - ;; code offset: 0x5d5 - 0x5d7 + ;; code offset: 0x5df - 0x5e1 (local.tee $0 - ;; code offset: 0x5d2 - 0x5d5 + ;; code offset: 0x5dc - 0x5df (i32.load - ;; code offset: 0x5d0 - 0x5d2 + ;; code offset: 0x5da - 0x5dc (local.get $0) ) ) - ;; code offset: 0x5d7 - 0x5d9 + ;; code offset: 0x5e1 - 0x5e3 (i32.const 1) ) ) - ;; code offset: 0x5e2 - 0x5f3 + ;; code offset: 0x5ec - 0x5fd (if - ;; code offset: 0x5e1 - 0x5e2 + ;; code offset: 0x5eb - 0x5ec (i32.le_s - ;; code offset: 0x5dd - 0x5df + ;; code offset: 0x5e7 - 0x5e9 (local.get $0) - ;; code offset: 0x5df - 0x5e1 + ;; code offset: 0x5e9 - 0x5eb (i32.const 1) ) (then - ;; code offset: 0x5ee - 0x5f0 + ;; code offset: 0x5f8 - 0x5fa (br_if $label9 - ;; code offset: 0x5ed - 0x5ee + ;; code offset: 0x5f7 - 0x5f8 (i32.ne - ;; code offset: 0x5e9 - 0x5eb + ;; code offset: 0x5f3 - 0x5f5 (local.tee $2 - ;; code offset: 0x5e8 - 0x5e9 + ;; code offset: 0x5f2 - 0x5f3 (i32.add - ;; code offset: 0x5e4 - 0x5e6 + ;; code offset: 0x5ee - 0x5f0 (local.get $2) - ;; code offset: 0x5e6 - 0x5e8 + ;; code offset: 0x5f0 - 0x5f2 (i32.const 1) ) ) - ;; code offset: 0x5eb - 0x5ed + ;; code offset: 0x5f5 - 0x5f7 (local.get $3) ) ) - ;; code offset: 0x5f0 - 0x5f2 + ;; code offset: 0x5fa - 0x5fc (br $block4) ) ) ) - ;; code offset: 0x5f6 - 0x5f8 + ;; code offset: 0x600 - 0x602 (br_if $label10 - ;; code offset: 0x5f4 - 0x5f6 + ;; code offset: 0x5fe - 0x600 (local.get $6) ) ) ) - ;; code offset: 0x5fc - 0x5fe + ;; code offset: 0x606 - 0x608 (call $free - ;; code offset: 0x5fa - 0x5fc + ;; code offset: 0x604 - 0x606 (local.get $1) ) - ;; code offset: 0x600 - 0x602 + ;; code offset: 0x60a - 0x60c (call $free - ;; code offset: 0x5fe - 0x600 + ;; code offset: 0x608 - 0x60a (local.get $5) ) - ;; code offset: 0x604 - 0x606 + ;; code offset: 0x60e - 0x610 (local.set $5 - ;; code offset: 0x602 - 0x604 + ;; code offset: 0x60c - 0x60e (i32.const 0) ) - ;; code offset: 0x608 - 0x60a + ;; code offset: 0x612 - 0x614 (local.set $0 - ;; code offset: 0x606 - 0x608 + ;; code offset: 0x610 - 0x612 (i32.const 0) ) - ;; code offset: 0x60c - 0x637 + ;; code offset: 0x616 - 0x641 (if - ;; code offset: 0x60a - 0x60c + ;; code offset: 0x614 - 0x616 (local.get $4) (then - ;; code offset: 0x60e - 0x636 + ;; code offset: 0x618 - 0x640 (loop $label11 - ;; code offset: 0x614 - 0x616 + ;; code offset: 0x61e - 0x620 (local.set $1 - ;; code offset: 0x612 - 0x614 + ;; code offset: 0x61c - 0x61e (call $"fannkuch_worker(void*)" - ;; code offset: 0x610 - 0x612 + ;; code offset: 0x61a - 0x61c (local.get $4) ) ) - ;; code offset: 0x61b - 0x61d + ;; code offset: 0x625 - 0x627 (local.set $2 - ;; code offset: 0x618 - 0x61b + ;; code offset: 0x622 - 0x625 (i32.load offset=8 - ;; code offset: 0x616 - 0x618 + ;; code offset: 0x620 - 0x622 (local.get $4) ) ) - ;; code offset: 0x61f - 0x621 + ;; code offset: 0x629 - 0x62b (call $free - ;; code offset: 0x61d - 0x61f + ;; code offset: 0x627 - 0x629 (local.get $4) ) - ;; code offset: 0x62b - 0x62d + ;; code offset: 0x635 - 0x637 (local.set $0 - ;; code offset: 0x62a - 0x62b + ;; code offset: 0x634 - 0x635 (select - ;; code offset: 0x621 - 0x623 + ;; code offset: 0x62b - 0x62d (local.get $1) - ;; code offset: 0x623 - 0x625 + ;; code offset: 0x62d - 0x62f (local.get $0) - ;; code offset: 0x629 - 0x62a + ;; code offset: 0x633 - 0x634 (i32.lt_s - ;; code offset: 0x625 - 0x627 + ;; code offset: 0x62f - 0x631 (local.get $0) - ;; code offset: 0x627 - 0x629 + ;; code offset: 0x631 - 0x633 (local.get $1) ) ) ) - ;; code offset: 0x62f - 0x631 + ;; code offset: 0x639 - 0x63b (local.set $4 - ;; code offset: 0x62d - 0x62f + ;; code offset: 0x637 - 0x639 (local.get $2) ) - ;; code offset: 0x633 - 0x635 + ;; code offset: 0x63d - 0x63f (br_if $label11 - ;; code offset: 0x631 - 0x633 + ;; code offset: 0x63b - 0x63d (local.get $2) ) ) ) ) - ;; code offset: 0x63b - 0x63e + ;; code offset: 0x645 - 0x648 (i32.store offset=4 - ;; code offset: 0x637 - 0x639 + ;; code offset: 0x641 - 0x643 (local.get $8) - ;; code offset: 0x639 - 0x63b + ;; code offset: 0x643 - 0x645 (local.get $0) ) - ;; code offset: 0x642 - 0x645 + ;; code offset: 0x64c - 0x64f (i32.store - ;; code offset: 0x63e - 0x640 + ;; code offset: 0x648 - 0x64a (local.get $8) - ;; code offset: 0x640 - 0x642 + ;; code offset: 0x64a - 0x64c (local.get $3) ) - ;; code offset: 0x64c - 0x64d + ;; code offset: 0x656 - 0x657 (drop - ;; code offset: 0x64a - 0x64c + ;; code offset: 0x654 - 0x656 (call $iprintf - ;; code offset: 0x645 - 0x648 + ;; code offset: 0x64f - 0x652 (i32.const 1024) - ;; code offset: 0x648 - 0x64a + ;; code offset: 0x652 - 0x654 (local.get $8) ) ) ) - ;; code offset: 0x653 - 0x655 + ;; code offset: 0x65d - 0x65f (global.set $global$0 - ;; code offset: 0x652 - 0x653 + ;; code offset: 0x65c - 0x65d (i32.add - ;; code offset: 0x64e - 0x650 + ;; code offset: 0x658 - 0x65a (local.get $8) - ;; code offset: 0x650 - 0x652 + ;; code offset: 0x65a - 0x65c (i32.const 32) ) ) - ;; code offset: 0x655 - 0x657 + ;; code offset: 0x65f - 0x661 (local.get $5) ) ;; custom section ".debug_info", size 851 ;; custom section ".debug_loc", size 1073 ;; custom section ".debug_ranges", size 88 ;; custom section ".debug_abbrev", size 333 - ;; custom section ".debug_line", size 2618 + ;; custom section ".debug_line", size 2642 ;; custom section ".debug_str", size 434 ;; custom section "producers", size 135 ) From c164b4e4a48861dafea1fcb10927b4ef95fa95f5 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 08:29:56 -0700 Subject: [PATCH 63/93] test --- test/gtest/constraint.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index 1d854b028a9..1308f65c5fe 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -675,6 +675,12 @@ TEST(ConstraintTest, TestIncrement) { map.set(0, &add); EXPECT_EQ(map.get(0).size(), 0); + // Ditto, unsigned. + map.set(0, {GeU, {Literal(int32_t(10))}}); + map.approximateAnd(0, {LeU, {Literal::makeUnsignedMax(Type::i32)}}); + map.set(0, &add); + EXPECT_EQ(map.get(0).size(), 0); + // $0 >= 5 && $0 < 100 && $0 != $2, $0++ => we increment and remove the non- // constant term, leaving $0 >= 6 && $0 <= 100. map.set(0, {{GeS, {Literal(int32_t(5))}}, lts100}); From 5b3ef90da1ff41aa045a705e70b48d0ce20317dc Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 08:30:55 -0700 Subject: [PATCH 64/93] work --- .../lit/passes/constraint-analysis-loops.wast | 45 +++++++++---------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/test/lit/passes/constraint-analysis-loops.wast b/test/lit/passes/constraint-analysis-loops.wast index f9e82787435..6fa12d0ce1a 100644 --- a/test/lit/passes/constraint-analysis-loops.wast +++ b/test/lit/passes/constraint-analysis-loops.wast @@ -6,7 +6,7 @@ ;; CHECK: (import "a" "b" (func $import (type $2) (result i32))) (import "a" "b" (func $import (result i32))) - ;; CHECK: (func $infinite-loop (type $1) + ;; CHECK: (func $infinite-loop (type $0) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (loop $loop ;; CHECK-NEXT: (local.set $x @@ -32,7 +32,7 @@ ) ) - ;; CHECK: (func $almost-infinite-loop (type $1) + ;; CHECK: (func $almost-infinite-loop (type $0) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (loop $loop ;; CHECK-NEXT: (local.set $x @@ -110,7 +110,6 @@ ) ;; CHECK: (func $bound (type $0) ->>>>>>> myself/fuzz.constraint ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (loop $loop ;; CHECK-NEXT: (drop @@ -184,7 +183,7 @@ ) ) - ;; CHECK: (func $bound-flipped-ifs (type $1) + ;; CHECK: (func $bound-flipped-ifs (type $0) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (loop $loop ;; CHECK-NEXT: (drop @@ -254,7 +253,7 @@ ) ) - ;; CHECK: (func $bound-nonconstant-no (type $0) (param $p i32) + ;; CHECK: (func $bound-nonconstant-no (type $1) (param $p i32) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (loop $loop ;; CHECK-NEXT: (drop @@ -331,7 +330,7 @@ ) ) - ;; CHECK: (func $bound-incremented (type $1) + ;; CHECK: (func $bound-incremented (type $0) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (loop $loop ;; CHECK-NEXT: (drop @@ -393,7 +392,7 @@ ) ) - ;; CHECK: (func $bound-incremented-unsigned (type $1) + ;; CHECK: (func $bound-incremented-unsigned (type $0) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (loop $loop ;; CHECK-NEXT: (drop @@ -453,7 +452,7 @@ ) ) - ;; CHECK: (func $bound-incremented-while (type $1) + ;; CHECK: (func $bound-incremented-while (type $0) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (block $out ;; CHECK-NEXT: (loop $loop @@ -523,7 +522,7 @@ ) ) - ;; CHECK: (func $bound-incremented-inc-first (type $1) + ;; CHECK: (func $bound-incremented-inc-first (type $0) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (block $out ;; CHECK-NEXT: (loop $loop @@ -593,7 +592,7 @@ ) ) - ;; CHECK: (func $bound-incremented-inc-first-less (type $1) + ;; CHECK: (func $bound-incremented-inc-first-less (type $0) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (block $out ;; CHECK-NEXT: (loop $loop @@ -662,7 +661,7 @@ ) ) - ;; CHECK: (func $bound-incremented-inc-first-less-unsigned (type $1) + ;; CHECK: (func $bound-incremented-inc-first-less-unsigned (type $0) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (block $out ;; CHECK-NEXT: (loop $loop @@ -729,7 +728,7 @@ ) ) - ;; CHECK: (func $extra-constraint (type $1) + ;; CHECK: (func $extra-constraint (type $0) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (block $out ;; CHECK-NEXT: (loop $loop @@ -830,7 +829,7 @@ ) ) - ;; CHECK: (func $while-nonconstant (type $0) (param $len i32) + ;; CHECK: (func $while-nonconstant (type $1) (param $len i32) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (block $out ;; CHECK-NEXT: (loop $loop @@ -900,7 +899,7 @@ ) ) - ;; CHECK: (func $while-nonconstant-unsigned (type $0) (param $len i32) + ;; CHECK: (func $while-nonconstant-unsigned (type $1) (param $len i32) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (block $out ;; CHECK-NEXT: (loop $loop @@ -970,7 +969,7 @@ ) ) - ;; CHECK: (func $do-nonconstant (type $0) (param $len i32) + ;; CHECK: (func $do-nonconstant (type $1) (param $len i32) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.lt_s @@ -1045,7 +1044,7 @@ ) ) - ;; CHECK: (func $do-nonconstant-unsigned (type $0) (param $len i32) + ;; CHECK: (func $do-nonconstant-unsigned (type $1) (param $len i32) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.lt_u @@ -1119,7 +1118,7 @@ ) ) - ;; CHECK: (func $nested (type $0) (param $len i32) + ;; CHECK: (func $nested (type $1) (param $len i32) ;; CHECK-NEXT: (local $i i32) ;; CHECK-NEXT: (local $j i32) ;; CHECK-NEXT: (block $out @@ -1262,7 +1261,7 @@ ) ) - ;; CHECK: (func $nested-increment-i-later (type $0) (param $len i32) + ;; CHECK: (func $nested-increment-i-later (type $1) (param $len i32) ;; CHECK-NEXT: (local $i i32) ;; CHECK-NEXT: (local $j i32) ;; CHECK-NEXT: (block $out @@ -1406,7 +1405,7 @@ ) ) - ;; CHECK: (func $nested-from-nonconstant-no (type $0) (param $len i32) + ;; CHECK: (func $nested-from-nonconstant-no (type $1) (param $len i32) ;; CHECK-NEXT: (local $i i32) ;; CHECK-NEXT: (local $j i32) ;; CHECK-NEXT: (block $out @@ -1549,7 +1548,7 @@ ) ) - ;; CHECK: (func $add-overflow (type $0) (param $x i32) + ;; CHECK: (func $add-overflow (type $1) (param $x i32) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.ge_s ;; CHECK-NEXT: (local.get $x) @@ -1596,7 +1595,7 @@ ) ) - ;; CHECK: (func $add-overflow-yes (type $0) (param $x i32) + ;; CHECK: (func $add-overflow-yes (type $1) (param $x i32) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.ge_s ;; CHECK-NEXT: (local.get $x) @@ -1656,7 +1655,7 @@ ) ) - ;; CHECK: (func $add-overflow-unsigned (type $0) (param $x i32) + ;; CHECK: (func $add-overflow-unsigned (type $1) (param $x i32) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.ge_u ;; CHECK-NEXT: (local.get $x) @@ -1704,7 +1703,7 @@ ) ) - ;; CHECK: (func $add-overflow-unsigned-yes (type $0) (param $x i32) + ;; CHECK: (func $add-overflow-unsigned-yes (type $1) (param $x i32) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.ge_u ;; CHECK-NEXT: (local.get $x) From 33c554831e59a129927c3921766390ab82ff8b85 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 08:32:14 -0700 Subject: [PATCH 65/93] work --- test/gtest/constraint.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index 1308f65c5fe..eb0ea11e32b 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -681,6 +681,18 @@ TEST(ConstraintTest, TestIncrement) { map.set(0, &add); EXPECT_EQ(map.get(0).size(), 0); + // Ditto, 64-bit signed. + map.set(0, {GeS, {Literal(int64_t(10))}}); + map.approximateAnd(0, {LeS, {Literal::makeSignedMax(Type::i64)}}); + map.set(0, &add); + EXPECT_EQ(map.get(0).size(), 0); + + // Ditto, 64-bit unsigned. + map.set(0, {GeU, {Literal(int64_t(10))}}); + map.approximateAnd(0, {LeU, {Literal::makeUnsignedMax(Type::i64)}}); + map.set(0, &add); + EXPECT_EQ(map.get(0).size(), 0); + // $0 >= 5 && $0 < 100 && $0 != $2, $0++ => we increment and remove the non- // constant term, leaving $0 >= 6 && $0 <= 100. map.set(0, {{GeS, {Literal(int32_t(5))}}, lts100}); From 5a4997cbc4b714944168c9cc2c89ced33de64b39 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 08:39:47 -0700 Subject: [PATCH 66/93] work --- src/ir/constraint.cpp | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 38fa1a6a622..fee75a4fdd7 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -25,12 +25,6 @@ namespace wasm::constraint { std::optional> Constraint::getSpan() const { using namespace Abstract; - auto* c = std::get_if(&term); - if (!c) { - // Not comparing to a constant, so cannot be a constant span. - return {}; - } - auto minSigned = c->type == Type::i32 ? std::numeric_limits::min() : std::numeric_limits::min(); auto maxSigned = c->type == Type::i32 ? std::numeric_limits::max() @@ -39,6 +33,29 @@ std::optional> Constraint::getSpan() const { ? std::numeric_limits::max() : std::numeric_limits::max(); + auto* c = std::get_if(&term); + if (!c) { + // Not comparing to a constant, so we can infer very little here - but not + // nothing! + switch (op) { + // x < y, i.e., x is less than *something*, proves x < MAX_INT. + case LtS: + return Span{minSigned, maxSigned - 1}; + case LtU: + return Span{0, maxUnsigned - 1}; + + // Similarly, x > y proves x > MIN_INT. + case GtS: + return Span{minSigned + 1, maxSigned}; + case GtU: + return Span{1, maxUnsigned}; + + default: { + } + } + return {}; + } + switch (op) { case Eq: { auto x = c->getUnsigned(); From ab8463b81fd63abde3fa9b49784825bd72b56935 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 08:55:52 -0700 Subject: [PATCH 67/93] work --- src/ir/constraint.cpp | 48 ++++++++++++++++++++++++++----------------- src/ir/constraint.h | 5 ++++- 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index fee75a4fdd7..608040ab4e7 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -22,37 +22,47 @@ namespace wasm::constraint { -std::optional> Constraint::getSpan() const { +std::optional> Constraint::getSpan(std::optional type) const { using namespace Abstract; - auto minSigned = c->type == Type::i32 ? std::numeric_limits::min() + auto* c = std::get_if(&term); + if (c) { + // If passed in, the type must be right. + assert(!type || *type == c->type); + + type = c->type; + } + + auto minSigned = type && *type == Type::i32 ? std::numeric_limits::min() : std::numeric_limits::min(); - auto maxSigned = c->type == Type::i32 ? std::numeric_limits::max() + auto maxSigned = type && *type == Type::i32 ? std::numeric_limits::max() : std::numeric_limits::max(); - auto maxUnsigned = c->type == Type::i32 + auto maxUnsigned = type && *type == Type::i32 ? std::numeric_limits::max() : std::numeric_limits::max(); - auto* c = std::get_if(&term); if (!c) { - // Not comparing to a constant, so we can infer very little here - but not - // nothing! - switch (op) { - // x < y, i.e., x is less than *something*, proves x < MAX_INT. - case LtS: - return Span{minSigned, maxSigned - 1}; - case LtU: - return Span{0, maxUnsigned - 1}; + // Not comparing to a constant, so we can infer very little here, and only + // if we know the type. + if (type) { + switch (op) { + // x < y, i.e., x is less than *something*, proves x < MAX_INT. + case LtS: + return Span{minSigned, maxSigned - 1}; + case LtU: + return Span{0, maxUnsigned - 1}; - // Similarly, x > y proves x > MIN_INT. - case GtS: - return Span{minSigned + 1, maxSigned}; - case GtU: - return Span{1, maxUnsigned}; + // Similarly, x > y proves x > MIN_INT. + case GtS: + return Span{minSigned + 1, maxSigned}; + case GtU: + return Span{1, maxUnsigned}; - default: { + default: { + } } } + return {}; } diff --git a/src/ir/constraint.h b/src/ir/constraint.h index 85280dcbd1e..3cc55434d3c 100644 --- a/src/ir/constraint.h +++ b/src/ir/constraint.h @@ -68,7 +68,10 @@ struct Constraint { // Convert the constraint into a constant span, if possible. For example, // "<= 100 (unsigned)" turns into the span [0, 100]. - std::optional> getSpan() const; + // + // An optional type may be passed in. If not, the type is inferred from the + // term, when possible. + std::optional> getSpan(std::optional type={}) const; }; // We limit constraints to a low number to ensure good performance even with From 5a2c93c9500c12987f52f886929f2cc9f7c8693f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 08:59:15 -0700 Subject: [PATCH 68/93] work --- test/gtest/constraint.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index eb0ea11e32b..ee5f9256e57 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -1001,6 +1001,26 @@ TEST(ConstraintTest, GetSpan) { (Span{maxU64, maxU64})); } +TEST(ConstraintTest, GetSpanType) { + const IU64 minI32(std::numeric_limits::min()); + const IU64 maxI32(std::numeric_limits::max()); + const IU64 maxU32(std::numeric_limits::max()); + const IU64 minI64(std::numeric_limits::min()); + const IU64 maxI64(std::numeric_limits::max()); + const IU64 maxU64(std::numeric_limits::max()); + + // Providing the type to getSpan() doesn't help with certain things. + EXPECT_EQ((Constraint{Eq, {Index(0)}}.getSpan(Type::i32)), std::nullopt); + EXPECT_EQ((Constraint{Ne, {Index(1)}}.getSpan(Type::i64)), std::nullopt); + EXPECT_EQ((Constraint{GeU, {Index(2)}}.getSpan(Type::i32)), std::nullopt); + EXPECT_EQ((Constraint{GeS, {Index(0)}}.getSpan(Type::i64)), std::nullopt); + EXPECT_EQ((Constraint{LeU, {Index(1)}}.getSpan(Type::i64)), std::nullopt); + EXPECT_EQ((Constraint{LeS, {Index(2)}}.getSpan(Type::i32)), std::nullopt); + + // But it does help with others: x < y means x cannot be MAX_INT. +// EXPECT_EQ((Constraint{LtS, {Index(1)}}.getSpan()), (Span{IU64(0), maxU64})); +} + TEST(ConstraintTest, SpanOptimizations) { // Using spans, we can optimize things like {x < 100} => {x < 200}. Constraint lts100{LtS, {Literal(int32_t(100))}}; From af1ff9802e37a75c62258631ebc1b77ffc34a4f8 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 09:01:51 -0700 Subject: [PATCH 69/93] work --- test/gtest/constraint.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index ee5f9256e57..0393d38136d 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -1003,11 +1003,22 @@ TEST(ConstraintTest, GetSpan) { TEST(ConstraintTest, GetSpanType) { const IU64 minI32(std::numeric_limits::min()); + const IU64 minI32Plus1(std::numeric_limits::min() + 1); + const IU64 maxI32(std::numeric_limits::max()); + const IU64 maxI32Minus1(std::numeric_limits::max() - 1); + const IU64 maxU32(std::numeric_limits::max()); + const IU64 maxU32Minus1(std::numeric_limits::max() - 1); + const IU64 minI64(std::numeric_limits::min()); + const IU64 minI64Plus1(std::numeric_limits::min() + 1); + const IU64 maxI64(std::numeric_limits::max()); + const IU64 maxI64Minus1(std::numeric_limits::max() - 1); + const IU64 maxU64(std::numeric_limits::max()); + const IU64 maxU64Minus1(std::numeric_limits::max() - 1); // Providing the type to getSpan() doesn't help with certain things. EXPECT_EQ((Constraint{Eq, {Index(0)}}.getSpan(Type::i32)), std::nullopt); @@ -1018,7 +1029,7 @@ TEST(ConstraintTest, GetSpanType) { EXPECT_EQ((Constraint{LeS, {Index(2)}}.getSpan(Type::i32)), std::nullopt); // But it does help with others: x < y means x cannot be MAX_INT. -// EXPECT_EQ((Constraint{LtS, {Index(1)}}.getSpan()), (Span{IU64(0), maxU64})); + EXPECT_EQ((Constraint{LtS, {Index(0)}}.getSpan(Type::i32)), (Span{minI32, maxI32Minus1})); } TEST(ConstraintTest, SpanOptimizations) { From 73ef0377c749b0c6ee0db8dfde10f007a6f19be1 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 09:02:51 -0700 Subject: [PATCH 70/93] work --- test/gtest/constraint.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index 0393d38136d..a8a6da3ca69 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -1030,6 +1030,7 @@ TEST(ConstraintTest, GetSpanType) { // But it does help with others: x < y means x cannot be MAX_INT. EXPECT_EQ((Constraint{LtS, {Index(0)}}.getSpan(Type::i32)), (Span{minI32, maxI32Minus1})); + EXPECT_EQ((Constraint{LtS, {Index(0)}}.getSpan(Type::i64)), (Span{minI64, maxI64Minus1})); } TEST(ConstraintTest, SpanOptimizations) { From 9afad8e2debafc2df63d8c32bb9a2a316acf8003 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 09:03:24 -0700 Subject: [PATCH 71/93] work --- test/gtest/constraint.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index a8a6da3ca69..c642271fe97 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -1031,6 +1031,9 @@ TEST(ConstraintTest, GetSpanType) { // But it does help with others: x < y means x cannot be MAX_INT. EXPECT_EQ((Constraint{LtS, {Index(0)}}.getSpan(Type::i32)), (Span{minI32, maxI32Minus1})); EXPECT_EQ((Constraint{LtS, {Index(0)}}.getSpan(Type::i64)), (Span{minI64, maxI64Minus1})); + + EXPECT_EQ((Constraint{LtU, {Index(0)}}.getSpan(Type::i32)), (Span{0, maxU32Minus1})); + EXPECT_EQ((Constraint{LtU, {Index(0)}}.getSpan(Type::i64)), (Span{0, maxU64Minus1})); } TEST(ConstraintTest, SpanOptimizations) { From 1f3495a34eb7a2e31450ca82c49aeeb4dd18c7d7 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 09:04:33 -0700 Subject: [PATCH 72/93] work --- test/gtest/constraint.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index c642271fe97..a6cb0e3c501 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -1030,10 +1030,16 @@ TEST(ConstraintTest, GetSpanType) { // But it does help with others: x < y means x cannot be MAX_INT. EXPECT_EQ((Constraint{LtS, {Index(0)}}.getSpan(Type::i32)), (Span{minI32, maxI32Minus1})); - EXPECT_EQ((Constraint{LtS, {Index(0)}}.getSpan(Type::i64)), (Span{minI64, maxI64Minus1})); + EXPECT_EQ((Constraint{LtS, {Index(1)}}.getSpan(Type::i64)), (Span{minI64, maxI64Minus1})); - EXPECT_EQ((Constraint{LtU, {Index(0)}}.getSpan(Type::i32)), (Span{0, maxU32Minus1})); + EXPECT_EQ((Constraint{LtU, {Index(2)}}.getSpan(Type::i32)), (Span{0, maxU32Minus1})); EXPECT_EQ((Constraint{LtU, {Index(0)}}.getSpan(Type::i64)), (Span{0, maxU64Minus1})); + + EXPECT_EQ((Constraint{GtS, {Index(1)}}.getSpan(Type::i32)), (Span{minI32Plus1, maxI32})); + EXPECT_EQ((Constraint{GtS, {Index(2)}}.getSpan(Type::i64)), (Span{minI64Plus1, maxI64})); + + EXPECT_EQ((Constraint{GtU, {Index(0)}}.getSpan(Type::i32)), (Span{1, maxU32})); + EXPECT_EQ((Constraint{GtU, {Index(1)}}.getSpan(Type::i64)), (Span{1, maxU64})); } TEST(ConstraintTest, SpanOptimizations) { From 936d1724b1f35465e90be83832b4f9eae262e820 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 09:04:44 -0700 Subject: [PATCH 73/93] work --- src/ir/constraint.cpp | 10 ++++++---- src/ir/constraint.h | 2 +- test/gtest/constraint.cpp | 30 +++++++++++++++++++----------- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 608040ab4e7..261924997d5 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -33,10 +33,12 @@ std::optional> Constraint::getSpan(std::optional type) const { type = c->type; } - auto minSigned = type && *type == Type::i32 ? std::numeric_limits::min() - : std::numeric_limits::min(); - auto maxSigned = type && *type == Type::i32 ? std::numeric_limits::max() - : std::numeric_limits::max(); + auto minSigned = type && *type == Type::i32 + ? std::numeric_limits::min() + : std::numeric_limits::min(); + auto maxSigned = type && *type == Type::i32 + ? std::numeric_limits::max() + : std::numeric_limits::max(); auto maxUnsigned = type && *type == Type::i32 ? std::numeric_limits::max() : std::numeric_limits::max(); diff --git a/src/ir/constraint.h b/src/ir/constraint.h index 3cc55434d3c..1d762335392 100644 --- a/src/ir/constraint.h +++ b/src/ir/constraint.h @@ -71,7 +71,7 @@ struct Constraint { // // An optional type may be passed in. If not, the type is inferred from the // term, when possible. - std::optional> getSpan(std::optional type={}) const; + std::optional> getSpan(std::optional type = {}) const; }; // We limit constraints to a low number to ensure good performance even with diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index a6cb0e3c501..b2ae5bc09e7 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -1029,17 +1029,25 @@ TEST(ConstraintTest, GetSpanType) { EXPECT_EQ((Constraint{LeS, {Index(2)}}.getSpan(Type::i32)), std::nullopt); // But it does help with others: x < y means x cannot be MAX_INT. - EXPECT_EQ((Constraint{LtS, {Index(0)}}.getSpan(Type::i32)), (Span{minI32, maxI32Minus1})); - EXPECT_EQ((Constraint{LtS, {Index(1)}}.getSpan(Type::i64)), (Span{minI64, maxI64Minus1})); - - EXPECT_EQ((Constraint{LtU, {Index(2)}}.getSpan(Type::i32)), (Span{0, maxU32Minus1})); - EXPECT_EQ((Constraint{LtU, {Index(0)}}.getSpan(Type::i64)), (Span{0, maxU64Minus1})); - - EXPECT_EQ((Constraint{GtS, {Index(1)}}.getSpan(Type::i32)), (Span{minI32Plus1, maxI32})); - EXPECT_EQ((Constraint{GtS, {Index(2)}}.getSpan(Type::i64)), (Span{minI64Plus1, maxI64})); - - EXPECT_EQ((Constraint{GtU, {Index(0)}}.getSpan(Type::i32)), (Span{1, maxU32})); - EXPECT_EQ((Constraint{GtU, {Index(1)}}.getSpan(Type::i64)), (Span{1, maxU64})); + EXPECT_EQ((Constraint{LtS, {Index(0)}}.getSpan(Type::i32)), + (Span{minI32, maxI32Minus1})); + EXPECT_EQ((Constraint{LtS, {Index(1)}}.getSpan(Type::i64)), + (Span{minI64, maxI64Minus1})); + + EXPECT_EQ((Constraint{LtU, {Index(2)}}.getSpan(Type::i32)), + (Span{0, maxU32Minus1})); + EXPECT_EQ((Constraint{LtU, {Index(0)}}.getSpan(Type::i64)), + (Span{0, maxU64Minus1})); + + EXPECT_EQ((Constraint{GtS, {Index(1)}}.getSpan(Type::i32)), + (Span{minI32Plus1, maxI32})); + EXPECT_EQ((Constraint{GtS, {Index(2)}}.getSpan(Type::i64)), + (Span{minI64Plus1, maxI64})); + + EXPECT_EQ((Constraint{GtU, {Index(0)}}.getSpan(Type::i32)), + (Span{1, maxU32})); + EXPECT_EQ((Constraint{GtU, {Index(1)}}.getSpan(Type::i64)), + (Span{1, maxU64})); } TEST(ConstraintTest, SpanOptimizations) { From 86ef62a0123f421d34ef29c16618412e860deb77 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 09:05:55 -0700 Subject: [PATCH 74/93] work --- src/ir/constraint.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 261924997d5..8491037eb02 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -188,8 +188,8 @@ Result provesConstantPair(Abstract::Op aOp, } // If we can represent both as spans, we can calculate that way. - if (auto aSpan = Constraint{aOp, {aConstant}}.getSpan()) { - if (auto bSpan = Constraint{bOp, {bConstant}}.getSpan()) { + if (auto aSpan = Constraint{aOp, {aConstant}}.getSpan(aConstant.type)) { + if (auto bSpan = Constraint{bOp, {bConstant}}.getSpan(bConstant.type)) { if (aSpan->isEmpty()) { // An empty span implies a contradiction (e.g. x > MAX_INT), as it means // no possible number can apply. And contradictions prove anything. From 4c0bd9cbc08f757e900607601ea0142db91d4ca4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 09:35:02 -0700 Subject: [PATCH 75/93] work --- src/ir/constraint.cpp | 64 +++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 8491037eb02..7ab7411ac6b 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -187,31 +187,6 @@ Result provesConstantPair(Abstract::Op aOp, } } - // If we can represent both as spans, we can calculate that way. - if (auto aSpan = Constraint{aOp, {aConstant}}.getSpan(aConstant.type)) { - if (auto bSpan = Constraint{bOp, {bConstant}}.getSpan(bConstant.type)) { - if (aSpan->isEmpty()) { - // An empty span implies a contradiction (e.g. x > MAX_INT), as it means - // no possible number can apply. And contradictions prove anything. - return True; - } - if (bSpan->isEmpty()) { - // Anything that is not a contradiction can prove a contradiction. - return False; - } - if (bSpan->contains(*aSpan)) { - // b's values contains a's, e.g., b = { 0 < x < 10 } and - // a = { 3 < x < 7 }, so a => b. - return True; - } - if (!bSpan->hasOverlap(*aSpan)) { - // There is no overlap at all, e.g., { 0 < x < 10 } vs { 20 < x < 30 }, - // both cannot be true and each proves the other false. - return False; - } - } - } - if (!recursing) { // The flipped operation may tell us something: y ==> !x implies // x ==> y is false (because if not, then x would prove y, and y would @@ -241,7 +216,39 @@ Result provesPair(const Constraint& a, const Constraint& b) { auto* aConstant = std::get_if(&a.term); auto* bConstant = std::get_if(&b.term); if (aConstant && bConstant) { - return provesConstantPair(a.op, *aConstant, b.op, *bConstant); + auto result = provesConstantPair(a.op, *aConstant, b.op, *bConstant); + if (result != Unknown) { + return result; + } + } + + // If we can represent both as spans, we can calculate that way. At least one + // must be a constant in this case, so that we know the type. + if (aConstant || bConstant) { + auto type = aConstant ? aConstant->type : bConstant->type; + if (auto aSpan = a.getSpan(type)) { + if (auto bSpan = b.getSpan(type)) { + if (aSpan->isEmpty()) { + // An empty span implies a contradiction (e.g. x > MAX_INT), as it means + // no possible number can apply. And contradictions prove anything. + return True; + } + if (bSpan->isEmpty()) { + // Anything that is not a contradiction can prove a contradiction. + return False; + } + if (bSpan->contains(*aSpan)) { + // b's values contains a's, e.g., b = { 0 < x < 10 } and + // a = { 3 < x < 7 }, so a => b. + return True; + } + if (!bSpan->hasOverlap(*aSpan)) { + // There is no overlap at all, e.g., { 0 < x < 10 } vs { 20 < x < 30 }, + // both cannot be true and each proves the other false. + return False; + } + } + } } return Unknown; @@ -739,7 +746,7 @@ void BasicBlockConstraintMap::set(Index index, Expression* value) { break; // x < N, x++ => x <= N case LtS: - c.op = LeS; + c.op = LeS; // do we need it on non-constants too? break; case LtU: c.op = LeU; @@ -775,6 +782,9 @@ void BasicBlockConstraintMap::set(Index index, Expression* value) { new_.approximateAnd({GtU, {Literal::makeFromInt32(0, type)}}); } +std::cout << old << " -> " << new_ << '\n'; + + set(index, new_); return; } From 21738235a21e6660e02551161a76c8cd38d102a0 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 09:45:48 -0700 Subject: [PATCH 76/93] work --- src/ir/constraint.cpp | 57 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 7ab7411ac6b..3d39c8065ce 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -350,6 +350,57 @@ std::optional fusedApproximateAndPair(const Constraint& a, return {}; } +bool isImmediateContradiction(const Constraint& c) { + using namespace Abstract; + + auto* cc = std::get_if(&c.term); + if (!cc) { + // Only operations on constants can be immediate contradictions. + return false; + } + + auto minSigned = cc->type == Type::i32 + ? std::numeric_limits::min() + : std::numeric_limits::min(); + auto maxSigned = cc->type == Type::i32 + ? std::numeric_limits::max() + : std::numeric_limits::max(); + auto maxUnsigned = cc->type == Type::i32 + ? std::numeric_limits::max() + : std::numeric_limits::max(); + + switch (c.op) { + case LtS: + if (cc->getInteger() == minSigned) { + // Less than the lowest possible number. + return true; + } + break; + case LtU: + if (cc->getInteger() == 0) { + // Less than the lowest possible number. + return true; + } + break; + case GtS: + if (cc->getInteger() == maxSigned) { + // Greater than the highest possible number. + return true; + } + break; + case GtU: + if (cc->getUnsigned() == maxUnsigned) { + // Greater than the highest possible number. + return true; + } + break; + default: { + } + } + + return false; +} + } // anonymous namespace void AndedConstraintSet::approximateAnd(const Constraint& c) { @@ -358,6 +409,12 @@ void AndedConstraintSet::approximateAnd(const Constraint& c) { return; } + // We don't store contradictions: identify them and mark us as such. + if (isImmediateContradiction(c)) { + setProvesEverything(); + return; + } + auto result = proves(c); if (result == True) { // We already prove c to be true, so it adds nothing. From f1ba9f7b236ab8926144099443ef3b6bd34cf7ab Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 09:45:56 -0700 Subject: [PATCH 77/93] fix --- .../lit/passes/constraint-analysis-loops.wast | 60 ++++--------------- 1 file changed, 12 insertions(+), 48 deletions(-) diff --git a/test/lit/passes/constraint-analysis-loops.wast b/test/lit/passes/constraint-analysis-loops.wast index 6fa12d0ce1a..e0b0e6eeded 100644 --- a/test/lit/passes/constraint-analysis-loops.wast +++ b/test/lit/passes/constraint-analysis-loops.wast @@ -263,10 +263,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.le_s - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: (local.get $p) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $x ;; CHECK-NEXT: (call $import) @@ -846,10 +843,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.ge_s - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $x ;; CHECK-NEXT: (i32.add @@ -916,10 +910,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.ge_u - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $x ;; CHECK-NEXT: (i32.add @@ -972,20 +963,14 @@ ;; CHECK: (func $do-nonconstant (type $1) (param $len i32) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (if - ;; CHECK-NEXT: (i32.lt_s - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: (local.get $len) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (loop $loop ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.ge_s - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $x ;; CHECK-NEXT: (i32.add @@ -1047,20 +1032,14 @@ ;; CHECK: (func $do-nonconstant-unsigned (type $1) (param $len i32) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (if - ;; CHECK-NEXT: (i32.lt_u - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: (local.get $len) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (loop $loop ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.ge_u - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $x ;; CHECK-NEXT: (i32.add @@ -1136,10 +1115,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.ge_s - ;; CHECK-NEXT: (local.get $i) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $i ;; CHECK-NEXT: (i32.add @@ -1165,10 +1141,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.ge_s - ;; CHECK-NEXT: (local.get $j) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $j ;; CHECK-NEXT: (i32.add @@ -1279,10 +1252,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.ge_s - ;; CHECK-NEXT: (local.get $i) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block $in ;; CHECK-NEXT: (local.set $j @@ -1302,10 +1272,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.ge_s - ;; CHECK-NEXT: (local.get $j) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $j ;; CHECK-NEXT: (i32.add @@ -1423,10 +1390,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.ge_s - ;; CHECK-NEXT: (local.get $i) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $i ;; CHECK-NEXT: (i32.add From e552d7cebfc6edaa77df01ab5e26da572b222340 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 10:43:30 -0700 Subject: [PATCH 78/93] work --- src/ir/constraint.cpp | 5 +---- test/gtest/constraint.cpp | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 3d39c8065ce..d2e1056299f 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -839,9 +839,6 @@ void BasicBlockConstraintMap::set(Index index, Expression* value) { new_.approximateAnd({GtU, {Literal::makeFromInt32(0, type)}}); } -std::cout << old << " -> " << new_ << '\n'; - - set(index, new_); return; } @@ -1011,7 +1008,7 @@ std::ostream& operator<<(std::ostream& o, const Constraint& c) { if (auto* cc = std::get_if(&c.term)) { o << *cc; } else if (auto* i = std::get_if(&c.term)) { - o << "Index(" << *i << ')'; + o << "$" << *i; } o << '}'; return o; diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index b2ae5bc09e7..be8c0576102 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -717,6 +717,26 @@ TEST(ConstraintTest, TestEqConstraints) { check(map.get(1), {GtS, {Literal(int32_t(42))}}); } + +TEST(ConstraintTest, ComplexOrRegression) { + // $0 == 0 + BasicBlockConstraintMap left; + left.setReachable(); + left.set(0, {Eq, {Literal(int32_t(0))}}); + + // $0 <= 100, $0 > $1 + BasicBlockConstraintMap right; + right.setReachable(); + right.set(0, {{LeS, {Literal(int32_t(100))}}, {GtS, {Index(1)}}}); + + // $0 == 0 || $0 <= 100 => $0 <= 100 (0 is included in <= 100), but the + // other constraint, $0 > $1, was only on one side, and vanishes. + right.approximateOr(left); +std::cout << right << '\n'; + check(right.get(0), {LeS, {Literal(int32_t(100))}}); + abort(); +} + TEST(ConstraintTest, GetSpan) { const IU64 minI32(std::numeric_limits::min()); const IU64 maxI32(std::numeric_limits::max()); @@ -1126,3 +1146,4 @@ TEST(ConstraintTest, EmptySpanContradiction) { AndedConstraintSet impossible{gtsMax32}; checkOr(valid, impossible, valid); } + From b840e68f5a17f7e084b94c278adaf40a16729a98 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 10:48:26 -0700 Subject: [PATCH 79/93] work --- src/ir/constraint.cpp | 3 +++ test/gtest/constraint.cpp | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index d2e1056299f..b10562f18cc 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -864,11 +864,14 @@ bool BasicBlockConstraintMap::approximateOr( return true; } +std::cout << "aOr\n"; // We only need to loop on our locals, as any local that is missing in us is // one that would end up proving nothing (and get removed). bool changed = false; for (auto& [local, constraints] : map) { +std::cout << "Doing " << local << " : " << constraints << " with " << other.get(local) << "\n"; changed |= constraints.approximateOr(other.get(local)); +std::cout << " => " << constraints << "\n"; } // Anything that became trivial after the OR must be removed. diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index be8c0576102..bdbdf925060 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -731,9 +731,13 @@ TEST(ConstraintTest, ComplexOrRegression) { // $0 == 0 || $0 <= 100 => $0 <= 100 (0 is included in <= 100), but the // other constraint, $0 > $1, was only on one side, and vanishes. +std::cout << "\n\n\nNOW\n\n"; + right.approximateOr(left); std::cout << right << '\n'; check(right.get(0), {LeS, {Literal(int32_t(100))}}); + + EXPECT_TRUE(right.get(1).empty()); abort(); } From cb8980c54c40a63c05693b796cacabd07cc40c51 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 11:04:39 -0700 Subject: [PATCH 80/93] work --- src/ir/constraint.cpp | 10 ++++++++++ test/gtest/constraint.cpp | 3 +++ 2 files changed, 13 insertions(+) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index b10562f18cc..4281ae64c86 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -228,6 +228,8 @@ Result provesPair(const Constraint& a, const Constraint& b) { auto type = aConstant ? aConstant->type : bConstant->type; if (auto aSpan = a.getSpan(type)) { if (auto bSpan = b.getSpan(type)) { + +std::cout << "a " << *aSpan << " : " << *bSpan << "\n"; if (aSpan->isEmpty()) { // An empty span implies a contradiction (e.g. x > MAX_INT), as it means // no possible number can apply. And contradictions prove anything. @@ -289,15 +291,21 @@ Result AndedConstraintSet::proves(const AndedConstraintSet& other) const { bool hasUnknown = false; +std::cout << "looping proves for << " << *this << '\n'; for (auto& c : other) { +std::cout << " " << c << "\n"; auto result = proves(c); if (result == False) { +std::cout << " nope\n"; // The entire conjunction is proven false. return False; } if (result == Unknown) { +std::cout << " dunno\n"; hasUnknown = true; } +else +std::cout << " yass\n"; } return hasUnknown ? Unknown : True; @@ -593,6 +601,8 @@ bool AndedConstraintSet::approximateOr(const AndedConstraintSet& other) { // E.g. if we are { x = 10 } and other is { x >= 0 } then all we need is // { x >= 0 } as the result of the OR. if (other.proves(*this) == True) { +std::cout << "a3\n"; + return false; } if (proves(other) == True) { diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index bdbdf925060..5e3c569a863 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -39,6 +39,9 @@ TEST(ConstraintTest, TestEq) { // x != 5: we can infer false. EXPECT_EQ(s.proves(Constraint{Ne, {Literal(int32_t(5))}}), False); + + // x > y: we can infer nothing. + EXPECT_EQ(s.proves(Constraint{GtS, {Index(1)}}), Unknown); } TEST(ConstraintTest, TestNe) { From 4291d84464d81ef4643817be6916374dac416859 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 11:07:08 -0700 Subject: [PATCH 81/93] work --- src/ir/constraint.cpp | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 4281ae64c86..1b8f9445606 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -229,7 +229,6 @@ Result provesPair(const Constraint& a, const Constraint& b) { if (auto aSpan = a.getSpan(type)) { if (auto bSpan = b.getSpan(type)) { -std::cout << "a " << *aSpan << " : " << *bSpan << "\n"; if (aSpan->isEmpty()) { // An empty span implies a contradiction (e.g. x > MAX_INT), as it means // no possible number can apply. And contradictions prove anything. @@ -291,21 +290,15 @@ Result AndedConstraintSet::proves(const AndedConstraintSet& other) const { bool hasUnknown = false; -std::cout << "looping proves for << " << *this << '\n'; for (auto& c : other) { -std::cout << " " << c << "\n"; auto result = proves(c); if (result == False) { -std::cout << " nope\n"; // The entire conjunction is proven false. return False; } if (result == Unknown) { -std::cout << " dunno\n"; hasUnknown = true; } -else -std::cout << " yass\n"; } return hasUnknown ? Unknown : True; @@ -601,8 +594,6 @@ bool AndedConstraintSet::approximateOr(const AndedConstraintSet& other) { // E.g. if we are { x = 10 } and other is { x >= 0 } then all we need is // { x >= 0 } as the result of the OR. if (other.proves(*this) == True) { -std::cout << "a3\n"; - return false; } if (proves(other) == True) { @@ -874,14 +865,11 @@ bool BasicBlockConstraintMap::approximateOr( return true; } -std::cout << "aOr\n"; // We only need to loop on our locals, as any local that is missing in us is // one that would end up proving nothing (and get removed). bool changed = false; for (auto& [local, constraints] : map) { -std::cout << "Doing " << local << " : " << constraints << " with " << other.get(local) << "\n"; changed |= constraints.approximateOr(other.get(local)); -std::cout << " => " << constraints << "\n"; } // Anything that became trivial after the OR must be removed. From d9e14e438356a2fea292751389751c49094a4d29 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 11:07:22 -0700 Subject: [PATCH 82/93] work --- src/ir/constraint.cpp | 19 +++++++++---------- test/gtest/constraint.cpp | 6 ++---- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 1b8f9445606..8e41ac635d8 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -230,8 +230,9 @@ Result provesPair(const Constraint& a, const Constraint& b) { if (auto bSpan = b.getSpan(type)) { if (aSpan->isEmpty()) { - // An empty span implies a contradiction (e.g. x > MAX_INT), as it means - // no possible number can apply. And contradictions prove anything. + // An empty span implies a contradiction (e.g. x > MAX_INT), as it + // means no possible number can apply. And contradictions prove + // anything. return True; } if (bSpan->isEmpty()) { @@ -244,8 +245,8 @@ Result provesPair(const Constraint& a, const Constraint& b) { return True; } if (!bSpan->hasOverlap(*aSpan)) { - // There is no overlap at all, e.g., { 0 < x < 10 } vs { 20 < x < 30 }, - // both cannot be true and each proves the other false. + // There is no overlap at all, e.g., { 0 < x < 10 } vs { 20 < x < 30 + // }, both cannot be true and each proves the other false. return False; } } @@ -360,12 +361,10 @@ bool isImmediateContradiction(const Constraint& c) { return false; } - auto minSigned = cc->type == Type::i32 - ? std::numeric_limits::min() - : std::numeric_limits::min(); - auto maxSigned = cc->type == Type::i32 - ? std::numeric_limits::max() - : std::numeric_limits::max(); + auto minSigned = cc->type == Type::i32 ? std::numeric_limits::min() + : std::numeric_limits::min(); + auto maxSigned = cc->type == Type::i32 ? std::numeric_limits::max() + : std::numeric_limits::max(); auto maxUnsigned = cc->type == Type::i32 ? std::numeric_limits::max() : std::numeric_limits::max(); diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index 5e3c569a863..b0735407041 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -720,7 +720,6 @@ TEST(ConstraintTest, TestEqConstraints) { check(map.get(1), {GtS, {Literal(int32_t(42))}}); } - TEST(ConstraintTest, ComplexOrRegression) { // $0 == 0 BasicBlockConstraintMap left; @@ -734,10 +733,10 @@ TEST(ConstraintTest, ComplexOrRegression) { // $0 == 0 || $0 <= 100 => $0 <= 100 (0 is included in <= 100), but the // other constraint, $0 > $1, was only on one side, and vanishes. -std::cout << "\n\n\nNOW\n\n"; + std::cout << "\n\n\nNOW\n\n"; right.approximateOr(left); -std::cout << right << '\n'; + std::cout << right << '\n'; check(right.get(0), {LeS, {Literal(int32_t(100))}}); EXPECT_TRUE(right.get(1).empty()); @@ -1153,4 +1152,3 @@ TEST(ConstraintTest, EmptySpanContradiction) { AndedConstraintSet impossible{gtsMax32}; checkOr(valid, impossible, valid); } - From 1ac0fdb3f7c285c9de47f6997c2cbb46b7e79af9 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 11:19:59 -0700 Subject: [PATCH 83/93] work --- src/ir/constraint.cpp | 65 ++++++++++++++++++++++++++----------------- src/ir/constraint.h | 7 +++++ 2 files changed, 46 insertions(+), 26 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 8e41ac635d8..4f42d7ac237 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -22,15 +22,17 @@ namespace wasm::constraint { -std::optional> Constraint::getSpan(std::optional type) const { +namespace { + +std::optional> getSpanInternal(const Constraint& c, std::optional type, bool exact) { using namespace Abstract; - auto* c = std::get_if(&term); - if (c) { + auto* cc = std::get_if(&c.term); + if (cc) { // If passed in, the type must be right. - assert(!type || *type == c->type); + assert(!type || *type == cc->type); - type = c->type; + type = cc->type; } auto minSigned = type && *type == Type::i32 @@ -43,11 +45,11 @@ std::optional> Constraint::getSpan(std::optional type) const { ? std::numeric_limits::max() : std::numeric_limits::max(); - if (!c) { - // Not comparing to a constant, so we can infer very little here, and only - // if we know the type. - if (type) { - switch (op) { + if (!cc) { + // Not comparing to a constant, so we can't infer anything exact, but might + // if we just need something we can prove, and if we know the type. + if (!exact && type) { + switch (c.op) { // x < y, i.e., x is less than *something*, proves x < MAX_INT. case LtS: return Span{minSigned, maxSigned - 1}; @@ -68,9 +70,9 @@ std::optional> Constraint::getSpan(std::optional type) const { return {}; } - switch (op) { + switch (c.op) { case Eq: { - auto x = c->getUnsigned(); + auto x = cc->getUnsigned(); if (x <= uint64_t(maxSigned)) { // This is in the range of both signed and unsigned values, so there is // no ambiguity. That is, we cannot convert the bit pattern @@ -83,46 +85,46 @@ std::optional> Constraint::getSpan(std::optional type) const { } case LtS: - if (c->getInteger() == minSigned) { + if (cc->getInteger() == minSigned) { // Less than the lowest possible number is an empty span. return Span::empty(); } else { - return Span{minSigned, c->getInteger() - 1}; + return Span{minSigned, cc->getInteger() - 1}; } break; case LtU: - if (c->getInteger() == 0) { + if (cc->getInteger() == 0) { // Less than the lowest possible number is an empty span. return Span::empty(); } else { - return Span{0, c->getUnsigned() - 1}; + return Span{0, cc->getUnsigned() - 1}; } break; case LeS: - return Span{minSigned, c->getInteger()}; + return Span{minSigned, cc->getInteger()}; case LeU: - return Span{0, c->getUnsigned()}; + return Span{0, cc->getUnsigned()}; case GtS: - if (c->getInteger() == maxSigned) { + if (cc->getInteger() == maxSigned) { // Greater than the highest possible number is an empty span. return Span::empty(); } else { - return Span{c->getInteger() + 1, maxSigned}; + return Span{cc->getInteger() + 1, maxSigned}; } break; case GtU: - if (c->getUnsigned() == maxUnsigned) { + if (cc->getUnsigned() == maxUnsigned) { // Greater than the highest possible number is an empty span. return Span::empty(); } else { - return Span{c->getUnsigned() + 1, maxUnsigned}; + return Span{cc->getUnsigned() + 1, maxUnsigned}; } break; case GeS: - return Span{c->getInteger(), maxSigned}; + return Span{cc->getInteger(), maxSigned}; case GeU: - return Span{c->getUnsigned(), maxUnsigned}; + return Span{cc->getUnsigned(), maxUnsigned}; default: { } @@ -131,6 +133,16 @@ std::optional> Constraint::getSpan(std::optional type) const { return {}; } +} // anonymous namespace + +std::optional> Constraint::getSpan(std::optional type) const { + return getSpanInternal(*this, type, true); +} + +std::optional> Constraint::getProvenSpan(std::optional type) const { + return getSpanInternal(*this, type, false); +} + namespace { Result TrueFalse(bool x) { return x ? True : False; } @@ -226,9 +238,10 @@ Result provesPair(const Constraint& a, const Constraint& b) { // must be a constant in this case, so that we know the type. if (aConstant || bConstant) { auto type = aConstant ? aConstant->type : bConstant->type; - if (auto aSpan = a.getSpan(type)) { + // Use a proven span for a, and an exact one for b. This allows us to do + // a => proven span for a => exact span for b => b. + if (auto aSpan = a.getProvenSpan(type)) { if (auto bSpan = b.getSpan(type)) { - if (aSpan->isEmpty()) { // An empty span implies a contradiction (e.g. x > MAX_INT), as it // means no possible number can apply. And contradictions prove diff --git a/src/ir/constraint.h b/src/ir/constraint.h index 1d762335392..ced8edd0b46 100644 --- a/src/ir/constraint.h +++ b/src/ir/constraint.h @@ -72,6 +72,13 @@ struct Constraint { // An optional type may be passed in. If not, the type is inferred from the // term, when possible. std::optional> getSpan(std::optional type = {}) const; + + // Get a span we can prove. This is less precise than getSpan, which gets an + // *exact* span to represent the Constraint. Here we only return a span we can + // prove is true. For example, x < y cannot be represented exactly using a + // span (y is not a constant), but that x is smaller than *something* proves + // x is not MAX_INT, so we can return the span [MIN_INT, MAX_INT - 1]. + std::optional> getProvenSpan(std::optional type = {}) const; }; // We limit constraints to a low number to ensure good performance even with From ee00fdc8464f12e22b27df6dd06dc0af263f1661 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 11:20:29 -0700 Subject: [PATCH 84/93] work --- test/gtest/constraint.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index b0735407041..f5e9a9712fd 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -733,14 +733,9 @@ TEST(ConstraintTest, ComplexOrRegression) { // $0 == 0 || $0 <= 100 => $0 <= 100 (0 is included in <= 100), but the // other constraint, $0 > $1, was only on one side, and vanishes. - std::cout << "\n\n\nNOW\n\n"; - right.approximateOr(left); - std::cout << right << '\n'; check(right.get(0), {LeS, {Literal(int32_t(100))}}); - EXPECT_TRUE(right.get(1).empty()); - abort(); } TEST(ConstraintTest, GetSpan) { From b49b5c514767e7e3194ee9909ddfad2cd2ee96be Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 11:23:23 -0700 Subject: [PATCH 85/93] work --- test/gtest/constraint.cpp | 33 ++++++++++++++----- .../lit/passes/constraint-analysis-loops.wast | 15 +++++++-- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index f5e9a9712fd..240e7688f35 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -1049,26 +1049,41 @@ TEST(ConstraintTest, GetSpanType) { EXPECT_EQ((Constraint{LeU, {Index(1)}}.getSpan(Type::i64)), std::nullopt); EXPECT_EQ((Constraint{LeS, {Index(2)}}.getSpan(Type::i32)), std::nullopt); - // But it does help with others: x < y means x cannot be MAX_INT. - EXPECT_EQ((Constraint{LtS, {Index(0)}}.getSpan(Type::i32)), + // But it does help with others: x < y means x cannot be MAX_INT, so we can + // report a *proven* span, if not an exact one. + EXPECT_EQ((Constraint{LtS, {Index(0)}}.getProvenSpan(Type::i32)), (Span{minI32, maxI32Minus1})); - EXPECT_EQ((Constraint{LtS, {Index(1)}}.getSpan(Type::i64)), + EXPECT_EQ((Constraint{LtS, {Index(1)}}.getProvenSpan(Type::i64)), (Span{minI64, maxI64Minus1})); - EXPECT_EQ((Constraint{LtU, {Index(2)}}.getSpan(Type::i32)), + EXPECT_EQ((Constraint{LtU, {Index(2)}}.getProvenSpan(Type::i32)), (Span{0, maxU32Minus1})); - EXPECT_EQ((Constraint{LtU, {Index(0)}}.getSpan(Type::i64)), + EXPECT_EQ((Constraint{LtU, {Index(0)}}.getProvenSpan(Type::i64)), (Span{0, maxU64Minus1})); - EXPECT_EQ((Constraint{GtS, {Index(1)}}.getSpan(Type::i32)), + EXPECT_EQ((Constraint{GtS, {Index(1)}}.getProvenSpan(Type::i32)), (Span{minI32Plus1, maxI32})); - EXPECT_EQ((Constraint{GtS, {Index(2)}}.getSpan(Type::i64)), + EXPECT_EQ((Constraint{GtS, {Index(2)}}.getProvenSpan(Type::i64)), (Span{minI64Plus1, maxI64})); - EXPECT_EQ((Constraint{GtU, {Index(0)}}.getSpan(Type::i32)), + EXPECT_EQ((Constraint{GtU, {Index(0)}}.getProvenSpan(Type::i32)), (Span{1, maxU32})); - EXPECT_EQ((Constraint{GtU, {Index(1)}}.getSpan(Type::i64)), + EXPECT_EQ((Constraint{GtU, {Index(1)}}.getProvenSpan(Type::i64)), (Span{1, maxU64})); + + // But all the last things are impossible with an exact span. + EXPECT_EQ((Constraint{LtS, {Index(0)}}.getSpan(Type::i32)), std::nullopt); + EXPECT_EQ((Constraint{LtS, {Index(1)}}.getSpan(Type::i64)), std::nullopt); + EXPECT_EQ((Constraint{LtU, {Index(2)}}.getSpan(Type::i32)), std::nullopt); + EXPECT_EQ((Constraint{LtU, {Index(0)}}.getSpan(Type::i64)), std::nullopt); + EXPECT_EQ((Constraint{GtS, {Index(1)}}.getSpan(Type::i32)), std::nullopt); + EXPECT_EQ((Constraint{GtS, {Index(2)}}.getSpan(Type::i64)), std::nullopt); + EXPECT_EQ((Constraint{GtU, {Index(0)}}.getSpan(Type::i32)), std::nullopt); + EXPECT_EQ((Constraint{GtU, {Index(1)}}.getSpan(Type::i64)), std::nullopt); + + // Proven spans are otherwise like normal ones. + EXPECT_EQ((Constraint{Eq, {Literal(int32_t(42))}}.getProvenSpan()), + (Span{42, 42})); } TEST(ConstraintTest, SpanOptimizations) { diff --git a/test/lit/passes/constraint-analysis-loops.wast b/test/lit/passes/constraint-analysis-loops.wast index e0b0e6eeded..61b7253cafc 100644 --- a/test/lit/passes/constraint-analysis-loops.wast +++ b/test/lit/passes/constraint-analysis-loops.wast @@ -263,7 +263,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.le_s + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $p) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $x ;; CHECK-NEXT: (call $import) @@ -963,7 +966,10 @@ ;; CHECK: (func $do-nonconstant (type $1) (param $len i32) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (if - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.lt_s + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $len) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (loop $loop ;; CHECK-NEXT: (drop @@ -1032,7 +1038,10 @@ ;; CHECK: (func $do-nonconstant-unsigned (type $1) (param $len i32) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (if - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.lt_u + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $len) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (loop $loop ;; CHECK-NEXT: (drop From d1789d1465a02038fb301e545e2bb0d43ce10961 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 11:23:31 -0700 Subject: [PATCH 86/93] work --- src/ir/constraint.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 4f42d7ac237..a62a5aec018 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -24,7 +24,8 @@ namespace wasm::constraint { namespace { -std::optional> getSpanInternal(const Constraint& c, std::optional type, bool exact) { +std::optional> +getSpanInternal(const Constraint& c, std::optional type, bool exact) { using namespace Abstract; auto* cc = std::get_if(&c.term); @@ -139,7 +140,8 @@ std::optional> Constraint::getSpan(std::optional type) const { return getSpanInternal(*this, type, true); } -std::optional> Constraint::getProvenSpan(std::optional type) const { +std::optional> +Constraint::getProvenSpan(std::optional type) const { return getSpanInternal(*this, type, false); } From f14f67433131db2bbff1f1598db9bfede0915c45 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 12:30:23 -0700 Subject: [PATCH 87/93] work --- src/ir/constraint.cpp | 153 +++++++++++++++++++++++++------------- src/ir/constraint.h | 12 ++- test/gtest/constraint.cpp | 85 +++++++++++++++++++++ 3 files changed, 199 insertions(+), 51 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 6e7c8ce81f2..3d38bf99230 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -22,26 +22,58 @@ namespace wasm::constraint { -std::optional> Constraint::getSpan() const { +namespace { + +std::optional> +getSpanInternal(const Constraint& c, std::optional type, bool exact) { using namespace Abstract; - auto* c = std::get_if(&term); - if (!c) { - // Not comparing to a constant, so cannot be a constant span. - return {}; + auto* cc = std::get_if(&c.term); + if (cc) { + // If passed in, the type must be right. + assert(!type || *type == cc->type); + + type = cc->type; } - auto minSigned = c->type == Type::i32 ? std::numeric_limits::min() - : std::numeric_limits::min(); - auto maxSigned = c->type == Type::i32 ? std::numeric_limits::max() - : std::numeric_limits::max(); - auto maxUnsigned = c->type == Type::i32 + auto minSigned = type && *type == Type::i32 + ? std::numeric_limits::min() + : std::numeric_limits::min(); + auto maxSigned = type && *type == Type::i32 + ? std::numeric_limits::max() + : std::numeric_limits::max(); + auto maxUnsigned = type && *type == Type::i32 ? std::numeric_limits::max() : std::numeric_limits::max(); - switch (op) { + if (!cc) { + // Not comparing to a constant, so we can't infer anything exact, but might + // if we just need something we can prove, and if we know the type. + if (!exact && type) { + switch (c.op) { + // x < y, i.e., x is less than *something*, proves x < MAX_INT. + case LtS: + return Span{minSigned, maxSigned - 1}; + case LtU: + return Span{0, maxUnsigned - 1}; + + // Similarly, x > y proves x > MIN_INT. + case GtS: + return Span{minSigned + 1, maxSigned}; + case GtU: + return Span{1, maxUnsigned}; + + default: { + } + } + } + + return {}; + } + + switch (c.op) { case Eq: { - auto x = c->getUnsigned(); + auto x = cc->getUnsigned(); if (x <= uint64_t(maxSigned)) { // This is in the range of both signed and unsigned values, so there is // no ambiguity. That is, we cannot convert the bit pattern @@ -54,46 +86,46 @@ std::optional> Constraint::getSpan() const { } case LtS: - if (c->getInteger() == minSigned) { + if (cc->getInteger() == minSigned) { // Less than the lowest possible number is an empty span. return Span::empty(); } else { - return Span{minSigned, c->getInteger() - 1}; + return Span{minSigned, cc->getInteger() - 1}; } break; case LtU: - if (c->getInteger() == 0) { + if (cc->getInteger() == 0) { // Less than the lowest possible number is an empty span. return Span::empty(); } else { - return Span{0, c->getUnsigned() - 1}; + return Span{0, cc->getUnsigned() - 1}; } break; case LeS: - return Span{minSigned, c->getInteger()}; + return Span{minSigned, cc->getInteger()}; case LeU: - return Span{0, c->getUnsigned()}; + return Span{0, cc->getUnsigned()}; case GtS: - if (c->getInteger() == maxSigned) { + if (cc->getInteger() == maxSigned) { // Greater than the highest possible number is an empty span. return Span::empty(); } else { - return Span{c->getInteger() + 1, maxSigned}; + return Span{cc->getInteger() + 1, maxSigned}; } break; case GtU: - if (c->getUnsigned() == maxUnsigned) { + if (cc->getUnsigned() == maxUnsigned) { // Greater than the highest possible number is an empty span. return Span::empty(); } else { - return Span{c->getUnsigned() + 1, maxUnsigned}; + return Span{cc->getUnsigned() + 1, maxUnsigned}; } break; case GeS: - return Span{c->getInteger(), maxSigned}; + return Span{cc->getInteger(), maxSigned}; case GeU: - return Span{c->getUnsigned(), maxUnsigned}; + return Span{cc->getUnsigned(), maxUnsigned}; default: { } @@ -102,6 +134,17 @@ std::optional> Constraint::getSpan() const { return {}; } +} // anonymous namespace + +std::optional> Constraint::getSpan(std::optional type) const { + return getSpanInternal(*this, type, true); +} + +std::optional> +Constraint::getProvenSpan(std::optional type) const { + return getSpanInternal(*this, type, false); +} + namespace { Result TrueFalse(bool x) { return x ? True : False; } @@ -158,31 +201,6 @@ Result provesConstantPair(Abstract::Op aOp, } } - // If we can represent both as spans, we can calculate that way. - if (auto aSpan = Constraint{aOp, {aConstant}}.getSpan()) { - if (auto bSpan = Constraint{bOp, {bConstant}}.getSpan()) { - if (aSpan->isEmpty()) { - // An empty span implies a contradiction (e.g. x > MAX_INT), as it means - // no possible number can apply. And contradictions prove anything. - return True; - } - if (bSpan->isEmpty()) { - // Anything that is not a contradiction can prove a contradiction. - return False; - } - if (bSpan->contains(*aSpan)) { - // b's values contains a's, e.g., b = { 0 < x < 10 } and - // a = { 3 < x < 7 }, so a => b. - return True; - } - if (!bSpan->hasOverlap(*aSpan)) { - // There is no overlap at all, e.g., { 0 < x < 10 } vs { 20 < x < 30 }, - // both cannot be true and each proves the other false. - return False; - } - } - } - if (!recursing) { // The flipped operation may tell us something: y ==> !x implies // x ==> y is false (because if not, then x would prove y, and y would @@ -212,7 +230,42 @@ Result provesPair(const Constraint& a, const Constraint& b) { auto* aConstant = std::get_if(&a.term); auto* bConstant = std::get_if(&b.term); if (aConstant && bConstant) { - return provesConstantPair(a.op, *aConstant, b.op, *bConstant); + auto result = provesConstantPair(a.op, *aConstant, b.op, *bConstant); + if (result != Unknown) { + return result; + } + } + + // If we can represent both as spans, we can calculate that way. At least one + // must be a constant in this case, so that we know the type. + if (aConstant || bConstant) { + auto type = aConstant ? aConstant->type : bConstant->type; + // Use a proven span for a, and an exact one for b. This allows us to do + // a => proven span for a => exact span for b => b. + if (auto aSpan = a.getProvenSpan(type)) { + if (auto bSpan = b.getSpan(type)) { + if (aSpan->isEmpty()) { + // An empty span implies a contradiction (e.g. x > MAX_INT), as it + // means no possible number can apply. And contradictions prove + // anything. + return True; + } + if (bSpan->isEmpty()) { + // Anything that is not a contradiction can prove a contradiction. + return False; + } + if (bSpan->contains(*aSpan)) { + // b's values contains a's, e.g., b = { 0 < x < 10 } and + // a = { 3 < x < 7 }, so a => b. + return True; + } + if (!bSpan->hasOverlap(*aSpan)) { + // There is no overlap at all, e.g., { 0 < x < 10 } vs { 20 < x < 30 + // }, both cannot be true and each proves the other false. + return False; + } + } + } } return Unknown; diff --git a/src/ir/constraint.h b/src/ir/constraint.h index 85280dcbd1e..ced8edd0b46 100644 --- a/src/ir/constraint.h +++ b/src/ir/constraint.h @@ -68,7 +68,17 @@ struct Constraint { // Convert the constraint into a constant span, if possible. For example, // "<= 100 (unsigned)" turns into the span [0, 100]. - std::optional> getSpan() const; + // + // An optional type may be passed in. If not, the type is inferred from the + // term, when possible. + std::optional> getSpan(std::optional type = {}) const; + + // Get a span we can prove. This is less precise than getSpan, which gets an + // *exact* span to represent the Constraint. Here we only return a span we can + // prove is true. For example, x < y cannot be represented exactly using a + // span (y is not a constant), but that x is smaller than *something* proves + // x is not MAX_INT, so we can return the span [MIN_INT, MAX_INT - 1]. + std::optional> getProvenSpan(std::optional type = {}) const; }; // We limit constraints to a low number to ensure good performance even with diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index 47039f1ac0b..7e8423f7d04 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -39,6 +39,9 @@ TEST(ConstraintTest, TestEq) { // x != 5: we can infer false. EXPECT_EQ(s.proves(Constraint{Ne, {Literal(int32_t(5))}}), False); + + // x > y: we can infer nothing. + EXPECT_EQ(s.proves(Constraint{GtS, {Index(1)}}), Unknown); } TEST(ConstraintTest, TestNe) { @@ -682,6 +685,24 @@ TEST(ConstraintTest, TestEqConstraints) { check(map.get(1), {GtS, {Literal(int32_t(42))}}); } +TEST(ConstraintTest, ComplexOrRegression) { + // $0 == 0 + BasicBlockConstraintMap left; + left.setReachable(); + left.set(0, {Eq, {Literal(int32_t(0))}}); + + // $0 <= 100, $0 > $1 + BasicBlockConstraintMap right; + right.setReachable(); + right.set(0, {{LeS, {Literal(int32_t(100))}}, {GtS, {Index(1)}}}); + + // $0 == 0 || $0 <= 100 => $0 <= 100 (0 is included in <= 100), but the + // other constraint, $0 > $1, was only on one side, and vanishes. + right.approximateOr(left); + check(right.get(0), {LeS, {Literal(int32_t(100))}}); + EXPECT_TRUE(right.get(1).empty()); +} + TEST(ConstraintTest, GetSpan) { const IU64 minI32(std::numeric_limits::min()); const IU64 maxI32(std::numeric_limits::max()); @@ -966,6 +987,70 @@ TEST(ConstraintTest, GetSpan) { (Span{maxU64, maxU64})); } +TEST(ConstraintTest, GetSpanType) { + const IU64 minI32(std::numeric_limits::min()); + const IU64 minI32Plus1(std::numeric_limits::min() + 1); + + const IU64 maxI32(std::numeric_limits::max()); + const IU64 maxI32Minus1(std::numeric_limits::max() - 1); + + const IU64 maxU32(std::numeric_limits::max()); + const IU64 maxU32Minus1(std::numeric_limits::max() - 1); + + const IU64 minI64(std::numeric_limits::min()); + const IU64 minI64Plus1(std::numeric_limits::min() + 1); + + const IU64 maxI64(std::numeric_limits::max()); + const IU64 maxI64Minus1(std::numeric_limits::max() - 1); + + const IU64 maxU64(std::numeric_limits::max()); + const IU64 maxU64Minus1(std::numeric_limits::max() - 1); + + // Providing the type to getSpan() doesn't help with certain things. + EXPECT_EQ((Constraint{Eq, {Index(0)}}.getSpan(Type::i32)), std::nullopt); + EXPECT_EQ((Constraint{Ne, {Index(1)}}.getSpan(Type::i64)), std::nullopt); + EXPECT_EQ((Constraint{GeU, {Index(2)}}.getSpan(Type::i32)), std::nullopt); + EXPECT_EQ((Constraint{GeS, {Index(0)}}.getSpan(Type::i64)), std::nullopt); + EXPECT_EQ((Constraint{LeU, {Index(1)}}.getSpan(Type::i64)), std::nullopt); + EXPECT_EQ((Constraint{LeS, {Index(2)}}.getSpan(Type::i32)), std::nullopt); + + // But it does help with others: x < y means x cannot be MAX_INT, so we can + // report a *proven* span, if not an exact one. + EXPECT_EQ((Constraint{LtS, {Index(0)}}.getProvenSpan(Type::i32)), + (Span{minI32, maxI32Minus1})); + EXPECT_EQ((Constraint{LtS, {Index(1)}}.getProvenSpan(Type::i64)), + (Span{minI64, maxI64Minus1})); + + EXPECT_EQ((Constraint{LtU, {Index(2)}}.getProvenSpan(Type::i32)), + (Span{0, maxU32Minus1})); + EXPECT_EQ((Constraint{LtU, {Index(0)}}.getProvenSpan(Type::i64)), + (Span{0, maxU64Minus1})); + + EXPECT_EQ((Constraint{GtS, {Index(1)}}.getProvenSpan(Type::i32)), + (Span{minI32Plus1, maxI32})); + EXPECT_EQ((Constraint{GtS, {Index(2)}}.getProvenSpan(Type::i64)), + (Span{minI64Plus1, maxI64})); + + EXPECT_EQ((Constraint{GtU, {Index(0)}}.getProvenSpan(Type::i32)), + (Span{1, maxU32})); + EXPECT_EQ((Constraint{GtU, {Index(1)}}.getProvenSpan(Type::i64)), + (Span{1, maxU64})); + + // But all the last things are impossible with an exact span. + EXPECT_EQ((Constraint{LtS, {Index(0)}}.getSpan(Type::i32)), std::nullopt); + EXPECT_EQ((Constraint{LtS, {Index(1)}}.getSpan(Type::i64)), std::nullopt); + EXPECT_EQ((Constraint{LtU, {Index(2)}}.getSpan(Type::i32)), std::nullopt); + EXPECT_EQ((Constraint{LtU, {Index(0)}}.getSpan(Type::i64)), std::nullopt); + EXPECT_EQ((Constraint{GtS, {Index(1)}}.getSpan(Type::i32)), std::nullopt); + EXPECT_EQ((Constraint{GtS, {Index(2)}}.getSpan(Type::i64)), std::nullopt); + EXPECT_EQ((Constraint{GtU, {Index(0)}}.getSpan(Type::i32)), std::nullopt); + EXPECT_EQ((Constraint{GtU, {Index(1)}}.getSpan(Type::i64)), std::nullopt); + + // Proven spans are otherwise like normal ones. + EXPECT_EQ((Constraint{Eq, {Literal(int32_t(42))}}.getProvenSpan()), + (Span{42, 42})); +} + TEST(ConstraintTest, SpanOptimizations) { // Using spans, we can optimize things like {x < 100} => {x < 200}. Constraint lts100{LtS, {Literal(int32_t(100))}}; From 48cddc7ee85ead19424b67c4e48617562f4ab064 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 12:36:25 -0700 Subject: [PATCH 88/93] fix --- src/ir/constraint.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 6e7c8ce81f2..d0ba04d88ab 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -314,6 +314,55 @@ std::optional fusedApproximateAndPair(const Constraint& a, return {}; } +bool isImmediateContradiction(const Constraint& c) { + using namespace Abstract; + + auto* cc = std::get_if(&c.term); + if (!cc) { + // Only operations on constants can be immediate contradictions. + return false; + } + + auto minSigned = cc->type == Type::i32 ? std::numeric_limits::min() + : std::numeric_limits::min(); + auto maxSigned = cc->type == Type::i32 ? std::numeric_limits::max() + : std::numeric_limits::max(); + auto maxUnsigned = cc->type == Type::i32 + ? std::numeric_limits::max() + : std::numeric_limits::max(); + + switch (c.op) { + case LtS: + if (cc->getInteger() == minSigned) { + // Less than the lowest possible number. + return true; + } + break; + case LtU: + if (cc->getInteger() == 0) { + // Less than the lowest possible number. + return true; + } + break; + case GtS: + if (cc->getInteger() == maxSigned) { + // Greater than the highest possible number. + return true; + } + break; + case GtU: + if (cc->getUnsigned() == maxUnsigned) { + // Greater than the highest possible number. + return true; + } + break; + default: { + } + } + + return false; +} + } // anonymous namespace void AndedConstraintSet::approximateAnd(const Constraint& c) { @@ -322,6 +371,12 @@ void AndedConstraintSet::approximateAnd(const Constraint& c) { return; } + // We don't store contradictions: identify them and mark us as such. + if (isImmediateContradiction(c)) { + setProvesEverything(); + return; + } + auto result = proves(c); if (result == True) { // We already prove c to be true, so it adds nothing. From 344ac09786537b9d78d9ca3c3aabe3d37e0f113c Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 21 Aug 2026 16:08:16 -0700 Subject: [PATCH 89/93] oops, do not error on non-numbers in getSpan --- src/ir/constraint.cpp | 5 +++++ test/gtest/constraint.cpp | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index 2a342cd5716..f769a2acf60 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -36,6 +36,11 @@ getSpanInternal(const Constraint& c, std::optional type, bool exact) { type = cc->type; } + if (type && !type->isNumber()) { + // References etc. do not convert to spans. + return {}; + } + auto minSigned = type && *type == Type::i32 ? std::numeric_limits::min() : std::numeric_limits::min(); diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index 7e8423f7d04..b9ec2712b70 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -1127,3 +1127,9 @@ TEST(ConstraintTest, EmptySpanContradiction) { AndedConstraintSet impossible{gtsMax32}; checkOr(valid, impossible, valid); } + +TEST(ConstraintTest, GetSpanGC) { + // Reference types do not cause errors. + EXPECT_EQ((Constraint{Eq, {Literal::makeNull(HeapType::eq)}}.getSpan()), + std::nullopt); +} From 70799e352e9c28affbef4ec8c34841b06c28ec18 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 24 Aug 2026 12:19:42 -0700 Subject: [PATCH 90/93] fix --- src/ir/constraint.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index a415bd0602e..f6554fc9783 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -825,7 +825,7 @@ void BasicBlockConstraintMap::set(Index index, Expression* value) { break; // x < N, x++ => x <= N case LtS: - c.op = LeS; // do we need it on non-constants too? + c.op = LeS; break; case LtU: c.op = LeU; From 650e21f705aee267acbe65cd61118ae38435a802 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 24 Aug 2026 12:23:12 -0700 Subject: [PATCH 91/93] fix --- test/gtest/constraint.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/gtest/constraint.cpp b/test/gtest/constraint.cpp index 942b10752c4..523bc4fbc2a 100644 --- a/test/gtest/constraint.cpp +++ b/test/gtest/constraint.cpp @@ -696,8 +696,8 @@ TEST(ConstraintTest, TestIncrement) { map.set(0, &add); EXPECT_EQ(map.get(0).size(), 0); - // $0 >= 5 && $0 < 100 && $0 != $2, $0++ => we increment and remove the non- - // constant term, leaving $0 >= 6 && $0 <= 100. + // $0 >= 5 && $0 < 100 && $0 == $2, $0++ => we increment and remove the non- + // constant term, leaving $0 > 5 && $0 <= 100. map.set(0, {{GeS, {Literal(int32_t(5))}}, lts100}); map.approximateAnd(0, {Eq, {Index(2)}}); map.set(0, &add); From 312a11015e369cf51fad099db9a1ada9f257548f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 25 Aug 2026 08:50:50 -0700 Subject: [PATCH 92/93] fix compile warning --- src/ir/constraint.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ir/constraint.cpp b/src/ir/constraint.cpp index f6554fc9783..9f3e0e12c9f 100644 --- a/src/ir/constraint.cpp +++ b/src/ir/constraint.cpp @@ -810,14 +810,14 @@ void BasicBlockConstraintMap::set(Index index, Expression* value) { break; // x >= N, x++ => x > N if no overflow case GeS: - if (old.proves({LtS, Literal::makeSignedMax(N->type)}) != True) { + if (old.proves({LtS, {Literal::makeSignedMax(N->type)}}) != True) { iter = new_.erase(iter); continue; } c.op = GtS; break; case GeU: - if (old.proves({LtU, Literal::makeUnsignedMax(N->type)}) != True) { + if (old.proves({LtU, {Literal::makeUnsignedMax(N->type)}}) != True) { iter = new_.erase(iter); continue; } From 1870ec87497309b540e0c358052ae7d02b059666 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 25 Aug 2026 09:08:34 -0700 Subject: [PATCH 93/93] add a test --- .../lit/passes/constraint-analysis-loops.wast | 124 +++++++++++++++++- 1 file changed, 123 insertions(+), 1 deletion(-) diff --git a/test/lit/passes/constraint-analysis-loops.wast b/test/lit/passes/constraint-analysis-loops.wast index 41fdcdf4730..cbec8495f43 100644 --- a/test/lit/passes/constraint-analysis-loops.wast +++ b/test/lit/passes/constraint-analysis-loops.wast @@ -3,7 +3,7 @@ ;; RUN: wasm-opt %s --constraint-analysis -all -S -o - | filecheck %s (module - ;; CHECK: (import "a" "b" (func $import (type $2) (result i32))) + ;; CHECK: (import "a" "b" (func $import (type $3) (result i32))) (import "a" "b" (func $import (result i32))) ;; CHECK: (func $infinite-loop (type $0) @@ -1788,4 +1788,126 @@ ) ) ) + + ;; CHECK: (func $add-overflow-unsigned-yes-nonconstant (type $2) (param $x i32) (param $y i32) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.ge_u + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.lt_u + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $add-overflow-unsigned-yes-nonconstant (param $x i32) (param $y i32) + ;; As above, but the upper bound is not a constant, it is $y, another + ;; unknown value. This is still enough: $x < $y means $x++ cannot overflow, + ;; as it was not MAX_INT. + (if + (i32.ge_u + (local.get $x) + (i32.const 1) + ) + (then + (if + (i32.lt_u + (local.get $x) + (local.get $y) + ) + (then + (local.set $x + (i32.add + (local.get $x) + (i32.const 1) + ) + ) + ;; We do optimize to 1. + (drop + (i32.gt_u + (local.get $x) + (i32.const 1) + ) + ) + ) + ) + ) + ) + ) + + ;; CHECK: (func $add-overflow-signed-yes-nonconstant (type $2) (param $x i32) (param $y i32) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.ge_s + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.lt_s + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $add-overflow-signed-yes-nonconstant (param $x i32) (param $y i32) + ;; Ditto, signed. + (if + (i32.ge_s + (local.get $x) + (i32.const 1) + ) + (then + (if + (i32.lt_s + (local.get $x) + (local.get $y) + ) + (then + (local.set $x + (i32.add + (local.get $x) + (i32.const 1) + ) + ) + ;; We do optimize to 1. + (drop + (i32.gt_s + (local.get $x) + (i32.const 1) + ) + ) + ) + ) + ) + ) + ) )