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)