cleanup
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 43e503e..f7dcd5d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -468,4 +468,3 @@
 endif()
 
 configure_file(scripts/binaryen-lit.in ${CMAKE_BINARY_DIR}/bin/binaryen-lit @ONLY)
-
diff --git a/src/passes/CoalesceLocals.cpp b/src/passes/CoalesceLocals.cpp
index edf1420..ba9b875 100644
--- a/src/passes/CoalesceLocals.cpp
+++ b/src/passes/CoalesceLocals.cpp
@@ -526,25 +526,7 @@
             continue;
           }
         }
-
-        // Remove ineffective actions, that is, dead stores.
-        //
-        // Note that this may have downsides for non-nullable locals:
-        //
-        //   x = whatever; // dead set for validation
-        //   if (..) {
-        //     x = value1;
-        //   } else {
-        //     x = value2;
-        //   }
-        //
-        // The dead set ensures validation, at the cost of extra code size and
-        // slower speed in some tiers (the optimizing tier, at least, will
-        // remove such dead sets anyhow). In theory keeping such a dead set may
-        // be worthwhile, as it may save code size (by keeping the local
-        // non-nullable and avoiding ref.as_non_nulls later). But the tradeoff
-        // here isn't clear, so do the simple thing for now and remove all dead
-        // sets.
+        // remove ineffective actions
         if (!action.effective) {
           // value may have no side effects, further optimizations can eliminate
           // it
diff --git a/src/support/permutation.h b/src/support/permutation.h
deleted file mode 100644
index ebe949a..0000000
--- a/src/support/permutation.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright 2017 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_permutation_h
-#define wasm_support_permutation_h
-
-// Utilities for operating on permutation vectors
-
-namespace wasm {
-
-namespace Permutation {
-
-inline std::vector<Index> makeIdentity(Index num) {
-  std::vector<Index> ret;
-  ret.resize(num);
-  for (Index i = 0; i < num; i++) {
-    ret[i] = i;
-  }
-  return ret;
-}
-
-inline void setIdentity(std::vector<Index>& ret) {
-  auto num = ret.size();
-  assert(num > 0); // must already be of the right size
-  for (Index i = 0; i < num; i++) {
-    ret[i] = i;
-  }
-}
-
-inline std::vector<Index> makeReversed(const std::vector<Index>& original) {
-  std::vector<Index> ret;
-  auto num = original.size();
-  ret.resize(num);
-  for (Index i = 0; i < num; i++) {
-    ret[original[i]] = i;
-  }
-  return ret;
-}
-
-// return a list of all permutations.
-inline std::vector<std::vector<Index>> makeAllPermutations(Index size) {
-  std::vector<std::vector<Index>> ret;
-  std::vector<Index> curr;
-  curr.resize(size);
-  for (auto& x : curr) x = 0;
-  while (1) {
-    std::set<Index> set;
-    for (auto x : curr) set.insert(x);
-    if (set.size() == size) {
-      ret.push_back(curr); // this is indeed a permutation
-    }
-    // advance to the next permutation in order
-    Index toBump = size - 1;
-    while (1) {
-      curr[toBump]++;
-      if (curr[toBump] < size) break;
-      // an overflow
-      if (toBump == 0) return ret; // all done
-      curr[toBump] = 0;
-      toBump--;
-    }
-  }
-}
-
-} // Permutation
-
-} // wasm
-
-#endif  // wasm_support_permutation_h
diff --git a/src/support/permutations.h b/src/support/permutations.h
index 2140630..4e6cc18 100644
--- a/src/support/permutations.h
+++ b/src/support/permutations.h
@@ -50,6 +50,31 @@
   return ret;
 }
 
+// Return a list of all permutations.
+inline std::vector<std::vector<Index>> makeAllPermutations(Index size) {
+  std::vector<std::vector<Index>> ret;
+  std::vector<Index> curr;
+  curr.resize(size);
+  for (auto& x : curr) x = 0;
+  while (1) {
+    std::set<Index> set;
+    for (auto x : curr) set.insert(x);
+    if (set.size() == size) {
+      ret.push_back(curr); // this is indeed a permutation
+    }
+    // advance to the next permutation in order
+    Index toBump = size - 1;
+    while (1) {
+      curr[toBump]++;
+      if (curr[toBump] < size) break;
+      // an overflow
+      if (toBump == 0) return ret; // all done
+      curr[toBump] = 0;
+      toBump--;
+    }
+  }
+}
+
 } // namespace wasm
 
 #endif // permutations
diff --git a/src/tools/CMakeLists.txt b/src/tools/CMakeLists.txt
index 7953eee..1dbe1ed 100644
--- a/src/tools/CMakeLists.txt
+++ b/src/tools/CMakeLists.txt
@@ -17,5 +17,6 @@
 binaryen_add_executable(wasm-ctor-eval wasm-ctor-eval.cpp)
 binaryen_add_executable(wasm-reduce wasm-reduce.cpp)
 binaryen_add_executable(wasm-fuzz-types "${fuzzing_SOURCES};wasm-fuzz-types.cpp")
+binaryen_add_executable(wasm-analyze wasm-analyze.cpp)
 
 add_subdirectory(wasm-split)