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)