determinism?
diff --git a/src/passes/SortBlocks.cpp b/src/passes/SortBlocks.cpp index 7353075..1d5aaf4 100644 --- a/src/passes/SortBlocks.cpp +++ b/src/passes/SortBlocks.cpp
@@ -62,23 +62,29 @@ // Do the sorting, by bubbling to the front and back (which is // where optimizations typically look). We pick the order of // lower hashes earlier. - for (Index i = 0; i < numSortable; i++) { - // Bubble forward. - Index j = i; - while (j < numSortable - 1 && - hashes[list[j]] > hashes[list[j + 1]] && - !effects.at(list[j]).invalidates(effects.at(list[j + 1]))) { - std::swap(list[j], list[j + 1]); - j++; - } - // Bubble backward, if we didn't move forward (if we did, there - // is no possibility to reverse). - if (j == i) { - while (j > 0 && - hashes[list[j]] < hashes[list[j - 1]] && - !effects.at(list[j]).invalidates(effects.at(list[j - 1]))) { - std::swap(list[j], list[j - 1]); + bool more = true; + while (more) { + more = false; + for (Index i = 0; i < numSortable; i++) { + // Bubble forward. + Index j = i; + while (j < numSortable - 1 && + hashes[list[j]] > hashes[list[j + 1]] && + !effects.at(list[j]).invalidates(effects.at(list[j + 1]))) { + std::swap(list[j], list[j + 1]); j++; + more = true; + } + // Bubble backward, if we didn't move forward (if we did, there + // is no possibility to reverse). + if (j == i) { + while (j > 0 && + hashes[list[j]] < hashes[list[j - 1]] && + !effects.at(list[j]).invalidates(effects.at(list[j - 1]))) { + std::swap(list[j], list[j - 1]); + j--; + more = true; + } } } }
diff --git a/test/passes/O3_low-memory-unused_metrics.txt b/test/passes/O3_low-memory-unused_metrics.txt index 48eb025..e6d26d8 100644 --- a/test/passes/O3_low-memory-unused_metrics.txt +++ b/test/passes/O3_low-memory-unused_metrics.txt
@@ -424,11 +424,6 @@ (br $label$6) ) ) - (local.set $4 - (i32.load offset=36 - (local.get $3) - ) - ) (local.set $6 (i32.load offset=16 (local.get $3) @@ -439,6 +434,11 @@ (local.get $3) ) ) + (local.set $4 + (i32.load offset=36 + (local.get $3) + ) + ) (local.set $9 (i32.load (local.get $3)
diff --git a/test/passes/O4_disable-bulk-memory.txt b/test/passes/O4_disable-bulk-memory.txt index 767903b..4b6faa1 100644 --- a/test/passes/O4_disable-bulk-memory.txt +++ b/test/passes/O4_disable-bulk-memory.txt
@@ -131,31 +131,36 @@ (loop $label$3 (if (i32.lt_s - (local.get $1) + (local.get $2) (local.get $7) ) (block - (local.set $3 - (f64.load offset=48 - (local.tee $2 - (i32.load offset=8 - (i32.add - (i32.load - (local.get $0) - ) - (i32.shl - (local.get $1) - (i32.const 2) - ) - ) + (local.set $1 + (i32.load offset=8 + (i32.add + (i32.load + (local.get $0) + ) + (i32.shl + (local.get $2) + (i32.const 2) ) ) ) ) - (local.set $1 - (i32.add - (local.get $1) - (i32.const 1) + (local.set $3 + (f64.add + (local.get $3) + (f64.mul + (f64.load offset=24 + (local.get $1) + ) + (local.tee $4 + (f64.load offset=48 + (local.get $1) + ) + ) + ) ) ) (local.set $5 @@ -163,21 +168,16 @@ (local.get $5) (f64.mul (f64.load offset=32 - (local.get $2) + (local.get $1) ) - (local.get $3) + (local.get $4) ) ) ) - (local.set $4 - (f64.add - (local.get $4) - (f64.mul - (f64.load offset=24 - (local.get $2) - ) - (local.get $3) - ) + (local.set $2 + (i32.add + (local.get $2) + (i32.const 1) ) ) (local.set $6 @@ -185,9 +185,9 @@ (local.get $6) (f64.mul (f64.load offset=40 - (local.get $2) + (local.get $1) ) - (local.get $3) + (local.get $4) ) ) ) @@ -219,7 +219,7 @@ ) (f64.div (f64.neg - (local.get $4) + (local.get $3) ) (f64.const 39.47841760435743) ) @@ -715,8 +715,8 @@ (local $3 i32) (local $4 f64) (local $5 f64) - (local $6 i32) - (local $7 f64) + (local $6 f64) + (local $7 i32) (local $8 f64) (local $9 f64) (local $10 f64) @@ -760,11 +760,6 @@ ) ) ) - (local.set $15 - (f64.load offset=16 - (local.get $0) - ) - ) (local.set $16 (f64.load offset=48 (local.get $0) @@ -775,22 +770,27 @@ (local.get $0) ) ) + (local.set $15 + (f64.load offset=16 + (local.get $0) + ) + ) (local.set $4 (f64.load offset=24 (local.get $0) ) ) (local.set $7 - (f64.load offset=40 - (local.get $0) - ) - ) - (local.set $6 (i32.add (local.get $3) (i32.const 1) ) ) + (local.set $6 + (f64.load offset=40 + (local.get $0) + ) + ) (local.set $17 (f64.load offset=8 (local.get $0) @@ -799,36 +799,43 @@ (loop $label$6 (if (i32.lt_u - (local.get $6) + (local.get $7) (local.get $13) ) (block + (local.set $2 + (f64.sub + (local.get $14) + (f64.load + (local.tee $1 + (i32.load offset=8 + (i32.add + (i32.load + (local.get $12) + ) + (i32.shl + (local.get $7) + (i32.const 2) + ) + ) + ) + ) + ) + ) + ) + (local.set $7 + (i32.add + (local.get $7) + (i32.const 1) + ) + ) (local.set $11 (f64.sqrt (local.tee $8 (f64.add (f64.add (f64.mul - (local.tee $2 - (f64.sub - (local.get $14) - (f64.load - (local.tee $1 - (i32.load offset=8 - (i32.add - (i32.load - (local.get $12) - ) - (i32.shl - (local.get $6) - (i32.const 2) - ) - ) - ) - ) - ) - ) - ) + (local.get $2) (local.get $2) ) (f64.mul @@ -882,6 +889,24 @@ ) ) ) + (local.set $6 + (f64.sub + (local.get $6) + (f64.mul + (local.get $10) + (local.get $8) + ) + ) + ) + (local.set $5 + (f64.sub + (local.get $5) + (f64.mul + (local.get $9) + (local.get $8) + ) + ) + ) (f64.store offset=24 (local.get $1) (f64.add @@ -911,15 +936,6 @@ ) ) ) - (local.set $5 - (f64.sub - (local.get $5) - (f64.mul - (local.get $9) - (local.get $8) - ) - ) - ) (f64.store offset=40 (local.get $1) (f64.add @@ -932,21 +948,6 @@ ) ) ) - (local.set $7 - (f64.sub - (local.get $7) - (f64.mul - (local.get $10) - (local.get $8) - ) - ) - ) - (local.set $6 - (i32.add - (local.get $6) - (i32.const 1) - ) - ) (br $label$6) ) ) @@ -961,7 +962,7 @@ ) (f64.store offset=40 (local.get $0) - (local.get $7) + (local.get $6) ) (f64.store (local.get $0) @@ -987,6 +988,12 @@ ) ) ) + (local.set $3 + (i32.add + (local.get $3) + (i32.const 1) + ) + ) (f64.store offset=16 (local.get $0) (f64.add @@ -995,16 +1002,10 @@ ) (f64.mul (f64.const 0.01) - (local.get $7) + (local.get $6) ) ) ) - (local.set $3 - (i32.add - (local.get $3) - (i32.const 1) - ) - ) (br $label$3) ) ) @@ -1059,7 +1060,7 @@ (f64.mul (f64.mul (f64.const 0.5) - (local.tee $8 + (local.tee $7 (f64.load offset=48 (local.get $0) ) @@ -1096,7 +1097,7 @@ ) ) ) - (local.set $7 + (local.set $8 (f64.load offset=8 (local.get $0) ) @@ -1137,7 +1138,7 @@ (local.get $1) (f64.div (f64.mul - (local.get $8) + (local.get $7) (f64.load offset=48 (local.get $3) ) @@ -1159,7 +1160,7 @@ (f64.mul (local.tee $1 (f64.sub - (local.get $7) + (local.get $8) (f64.load offset=8 (local.get $3) )
diff --git a/test/passes/inlining-optimizing_optimize-level=3.txt b/test/passes/inlining-optimizing_optimize-level=3.txt index a6e1969..def1c95 100644 --- a/test/passes/inlining-optimizing_optimize-level=3.txt +++ b/test/passes/inlining-optimizing_optimize-level=3.txt
@@ -1039,19 +1039,6 @@ (local.set $3 (global.get $STACKTOP) ) - (global.set $STACKTOP - (i32.add - (global.get $STACKTOP) - (i32.const 224) - ) - ) - (if - (i32.ge_s - (global.get $STACKTOP) - (global.get $STACK_MAX) - ) - (call $abort) - ) (local.set $8 (i32.add (local.tee $4 @@ -1065,6 +1052,19 @@ (i32.const 40) ) ) + (global.set $STACKTOP + (i32.add + (global.get $STACKTOP) + (i32.const 224) + ) + ) + (if + (i32.ge_s + (global.get $STACKTOP) + (global.get $STACK_MAX) + ) + (call $abort) + ) (local.set $6 (i32.add (local.get $3) @@ -2186,12 +2186,6 @@ ) (call $abort) ) - (local.set $33 - (i32.add - (local.get $13) - (i32.const 528) - ) - ) (local.set $37 (local.tee $25 (i32.add @@ -2235,12 +2229,34 @@ ) ) ) + (local.set $41 + (local.tee $29 + (i32.add + (local.get $23) + (i32.const 9) + ) + ) + ) (local.set $40 (i32.add (local.get $5) (i32.const 11) ) ) + (local.set $5 + (local.get $1) + ) + (local.set $47 + (i32.add + (local.tee $46 + (i32.add + (local.get $13) + (i32.const 24) + ) + ) + (i32.const 288) + ) + ) (local.set $42 (i32.add (local.tee $39 @@ -2258,6 +2274,21 @@ (i32.const 0) ) ) + (local.set $32 + (i32.add + (local.get $23) + (i32.const 8) + ) + ) + (local.set $1 + (i32.const 0) + ) + (local.set $33 + (i32.add + (local.get $13) + (i32.const 528) + ) + ) (local.set $21 (i32.add (local.get $13) @@ -2270,37 +2301,6 @@ (local.get $34) ) ) - (local.set $41 - (local.tee $29 - (i32.add - (local.get $23) - (i32.const 9) - ) - ) - ) - (local.set $47 - (i32.add - (local.tee $46 - (i32.add - (local.get $13) - (i32.const 24) - ) - ) - (i32.const 288) - ) - ) - (local.set $5 - (local.get $1) - ) - (local.set $32 - (i32.add - (local.get $23) - (i32.const 8) - ) - ) - (local.set $1 - (i32.const 0) - ) (local.set $45 (i32.add (local.get $22) @@ -2737,6 +2737,9 @@ ) ) ) + (local.set $8 + (i32.const 0) + ) (local.set $17 (i32.load (local.tee $10 @@ -2752,9 +2755,6 @@ ) ) ) - (local.set $8 - (i32.const 0) - ) (i32.store (local.get $2) (i32.add @@ -3503,15 +3503,15 @@ ) (br $label$continue$L1) ) + (local.set $16 + (i32.const 120) + ) (local.set $7 (i32.or (local.get $12) (i32.const 8) ) ) - (local.set $16 - (i32.const 120) - ) (local.set $6 (select (local.get $6) @@ -3661,18 +3661,18 @@ ) ) ) - (local.set $9 - (i32.const 4091) - ) - (local.set $8 - (i32.const 1) - ) (i32.store offset=4 (local.get $13) (local.tee $7 (global.get $tempRet0) ) ) + (local.set $9 + (i32.const 4091) + ) + (local.set $8 + (i32.const 1) + ) (br $__rjti$4) ) ) @@ -3725,6 +3725,12 @@ ) (br $__rjti$4) ) + (local.set $9 + (i32.const 4091) + ) + (local.set $11 + (i32.const 1) + ) (drop (i32.load offset=4 (local.get $13) @@ -3739,15 +3745,9 @@ (local.get $13) ) ) - (local.set $11 - (i32.const 1) - ) (local.set $12 (local.get $8) ) - (local.set $9 - (i32.const 4091) - ) (local.set $8 (i32.const 0) ) @@ -3836,6 +3836,11 @@ (global.get $tempDoublePtr) (local.get $14) ) + (drop + (i32.load + (global.get $tempDoublePtr) + ) + ) (local.set $30 (if (result i32) (i32.lt_s @@ -3884,11 +3889,6 @@ ) ) ) - (drop - (i32.load - (global.get $tempDoublePtr) - ) - ) (f64.store (global.get $tempDoublePtr) (local.get $14) @@ -4027,12 +4027,6 @@ ) ) ) - (local.set $11 - (i32.or - (local.get $27) - (i32.const 2) - ) - ) (if (i32.eq (local.tee $5 @@ -4107,15 +4101,21 @@ (i32.const 15) ) ) + (local.set $5 + (local.get $23) + ) + (local.set $11 + (i32.or + (local.get $27) + (i32.const 2) + ) + ) (local.set $16 (i32.lt_s (local.get $6) (i32.const 1) ) ) - (local.set $5 - (local.get $23) - ) (local.set $20 (i32.eqz (i32.and @@ -6317,15 +6317,15 @@ ) (br $label$continue$L1) ) - (local.set $7 - (local.get $5) - ) (local.set $9 (i32.const 4091) ) (local.set $8 (i32.const 0) ) + (local.set $7 + (local.get $5) + ) (local.set $11 (local.get $6) ) @@ -6485,12 +6485,12 @@ (local.get $15) ) ) - (local.set $12 - (local.get $8) - ) (local.set $9 (i32.const 4091) ) + (local.set $12 + (local.get $8) + ) (local.set $8 (i32.const 0) )
diff --git a/test/passes/sort-blocks.txt b/test/passes/sort-blocks.txt index a96782c..733dca8 100644 --- a/test/passes/sort-blocks.txt +++ b/test/passes/sort-blocks.txt
@@ -57,10 +57,10 @@ ) (func $func6 (; 5 ;) (type $0) (drop - (i32.const 2) + (i32.const 0) ) (drop - (i32.const 0) + (i32.const 2) ) (drop (i32.const 1)