diff --git a/src/asm2wasm.h b/src/asm2wasm.h
index 77be6aa..219d36c 100644
--- a/src/asm2wasm.h
+++ b/src/asm2wasm.h
@@ -515,7 +515,7 @@
   Block* blockify(Expression* expression) {
     if (expression->is<Block>() && !expression->cast<Block>()->name.is()) return expression->dynCast<Block>();
     auto ret = allocator.alloc<Block>();
-    ret->list.push_back(expression);
+    ret->list.push_back(expression, allocator);
     ret->finalize();
     return ret;
   }
@@ -532,8 +532,8 @@
       case BinaryOp::DivUInt64: call->target = I64U_DIV; break;
       default: WASM_UNREACHABLE();
     }
-    call->operands.push_back(left);
-    call->operands.push_back(right);
+    call->operands.push_back(left, allocator);
+    call->operands.push_back(right, allocator);
     call->type = i64;
     static std::set<Name> addedFunctions;
     if (addedFunctions.count(call->target) == 0) {
@@ -958,7 +958,7 @@
           // add a new param
           auto val = parent->allocator.alloc<Const>();
           val->type = val->value.type = type->params[i];
-          curr->operands.push_back(val);
+          curr->operands.push_back(val, parent->allocator);
         } else if (curr->operands[i]->type != type->params[i]) {
           // if the param is used, then we have overloading here and the combined type must be f64;
           // if this is an unreachable param, then it doesn't matter.
@@ -1119,8 +1119,8 @@
           x64 = Builder::addVar(func, "x64", i64),
           y64 = Builder::addVar(func, "y64", i64);
     auto* body = allocator.alloc<Block>();
-    body->list.push_back(builder.makeSetLocal(x64, I64Utilities::recreateI64(builder, xl, xh)));
-    body->list.push_back(builder.makeSetLocal(y64, I64Utilities::recreateI64(builder, yl, yh)));
+    body->list.push_back(builder.makeSetLocal(x64, I64Utilities::recreateI64(builder, xl, xh)), allocator);
+    body->list.push_back(builder.makeSetLocal(y64, I64Utilities::recreateI64(builder, yl, yh)), allocator);
     body->list.push_back(
       builder.makeIf(
         builder.makeGetLocal(r, i32),
@@ -1134,7 +1134,7 @@
           ),
           i64
         )
-      )
+      ), allocator
     );
     body->list.push_back(
       builder.makeSetLocal(
@@ -1144,15 +1144,15 @@
           builder.makeGetLocal(x64, i64),
           builder.makeGetLocal(y64, i64)
         )
-      )
+      ), allocator
     );
     body->list.push_back(
       builder.makeSetGlobal(
         tempRet0,
         I64Utilities::getI64High(builder, x64)
-      )
+      ), allocator
     );
-    body->list.push_back(I64Utilities::getI64Low(builder, x64));
+    body->list.push_back(I64Utilities::getI64Low(builder, x64), allocator);
     body->finalize();
     func->body = body;
   }
@@ -1301,8 +1301,8 @@
         // WebAssembly does not have floating-point remainder, we have to emit a call to a special import of ours
         CallImport *call = allocator.alloc<CallImport>();
         call->target = F64_REM;
-        call->operands.push_back(ret->left);
-        call->operands.push_back(ret->right);
+        call->operands.push_back(ret->left, allocator);
+        call->operands.push_back(ret->right, allocator);
         call->type = f64;
         static bool addedImport = false;
         if (!addedImport) {
@@ -1327,8 +1327,8 @@
           case BinaryOp::DivUInt32: call->target = I32U_DIV; break;
           default: WASM_UNREACHABLE();
         }
-        call->operands.push_back(ret->left);
-        call->operands.push_back(ret->right);
+        call->operands.push_back(ret->left, allocator);
+        call->operands.push_back(ret->right, allocator);
         call->type = i32;
         static std::set<Name> addedImport;
         if (addedImport.count(call->target) == 0) {
@@ -1473,7 +1473,7 @@
               conv->type = WasmType::f64;
               input = conv;
             }
-            ret->operands.push_back(input);
+            ret->operands.push_back(input, allocator);
             ret->type = i32;
             static bool addedImport = false;
             if (!addedImport) {
@@ -1578,7 +1578,7 @@
             isNegative->right = builder.makeConst(Literal(0));
             isNegative->finalize();
             auto block = allocator.alloc<Block>();
-            block->list.push_back(set);
+            block->list.push_back(set, allocator);
             auto flip = allocator.alloc<Binary>();
             flip->op = SubInt32;
             flip->left = builder.makeConst(Literal(0));
@@ -1589,7 +1589,7 @@
             select->ifFalse = get();
             select->condition = isNegative;
             select->type = i32;
-            block->list.push_back(select);
+            block->list.push_back(select, allocator);
             block->finalize();
             return block;
           } else if (value->type == f32 || value->type == f64) {
@@ -1769,7 +1769,7 @@
           ret = specific;
         }
         for (unsigned i = firstOperand; i < args->size(); i++) {
-          operands->push_back(process(args[i]));
+          operands->push_back(process(args[i]), allocator);
         }
         if (tableCall) {
           auto specific = ret->dynCast<CallIndirect>();
@@ -1792,7 +1792,7 @@
       ret->target = process(target[2]); // TODO: as an optimization, we could look through the mask
       Ref args = ast[2];
       for (unsigned i = 0; i < args->size(); i++) {
-        ret->operands.push_back(process(args[i]));
+        ret->operands.push_back(process(args[i]), allocator);
       }
       auto* fullType = getFunctionType(astStackHelper.getParent(), ret->operands);
       ret->fullType = fullType->name;
@@ -1828,7 +1828,7 @@
         } else {
           block = allocator.alloc<Block>();
           block->name = name;
-          block->list.push_back(ret);
+          block->list.push_back(ret, allocator);
           block->finalize();
           ret = block;
         }
@@ -1871,8 +1871,8 @@
         condition->ifTrue = breakOut;
         condition->finalize();
         auto body = allocator.alloc<Block>();
-        body->list.push_back(condition);
-        body->list.push_back(process(ast[2]));
+        body->list.push_back(condition, allocator);
+        body->list.push_back(process(ast[2]), allocator);
         body->finalize();
         ret->body = body;
       }
@@ -1880,7 +1880,7 @@
       Block* block = builder.blockifyWithName(ret->body, out);
       auto continuer = allocator.alloc<Break>();
       continuer->name = ret->name;
-      block->list.push_back(continuer);
+      block->list.push_back(continuer, allocator);
       block->finalize();
       ret->body = block;
       ret->finalize();
@@ -1913,9 +1913,9 @@
         breakSeeker.walk(child);
         if (breakSeeker.found == 0) {
           auto block = allocator.alloc<Block>();
-          block->list.push_back(child);
+          block->list.push_back(child, allocator);
           if (isConcreteWasmType(child->type)) {
-            block->list.push_back(builder.makeNop()); // ensure a nop at the end, so the block has guaranteed none type and no values fall through
+            block->list.push_back(builder.makeNop(), allocator); // ensure a nop at the end, so the block has guaranteed none type and no values fall through
           }
           block->name = stop;
           block->finalize();
@@ -1983,9 +1983,9 @@
       condition->ifTrue = breakOut;
       condition->finalize();
       auto body = allocator.alloc<Block>();
-      body->list.push_back(condition);
-      body->list.push_back(process(fbody));
-      body->list.push_back(process(finc));
+      body->list.push_back(condition, allocator);
+      body->list.push_back(process(fbody), allocator);
+      body->list.push_back(process(finc), allocator);
       body->finalize();
       ret->body = body;
       // loops do not automatically loop, add a branch back
@@ -2000,8 +2000,8 @@
       nameMapper.popLabelName(out);
       Block *outer = allocator.alloc<Block>();
       // add an outer block for the init as well
-      outer->list.push_back(process(finit));
-      outer->list.push_back(ret);
+      outer->list.push_back(process(finit), allocator);
+      outer->list.push_back(ret, allocator);
       outer->finalize();
       return outer;
     } else if (what == LABEL) {
@@ -2072,8 +2072,8 @@
         }
       }
       auto ret = allocator.alloc<Block>();
-      ret->list.push_back(process(ast[1]));
-      ret->list.push_back(process(ast[2]));
+      ret->list.push_back(process(ast[1]), allocator);
+      ret->list.push_back(process(ast[2]), allocator);
       ret->finalize();
       return ret;
     } else if (what == SWITCH) {
@@ -2133,7 +2133,7 @@
           br->condition = builder.makeUnary(UnaryOp::WrapInt64, offsetor); // TODO: check this fits in 32 bits
         }
 
-        top->list.push_back(br);
+        top->list.push_back(br, allocator);
         top->finalize();
 
         for (unsigned i = 0; i < cases->size(); i++) {
@@ -2152,14 +2152,14 @@
             uint64_t index_s = index;
             name = nameMapper.pushLabelName("switch-case");
             if (br->targets.size() <= index_s) {
-              br->targets.resize(index_s + 1);
+              br->targets.resize(index_s + 1, allocator);
             }
             br->targets[index_s] = name;
           }
           auto next = allocator.alloc<Block>();
           top->name = name;
-          next->list.push_back(top);
-          next->list.push_back(case_);
+          next->list.push_back(top, allocator);
+          next->list.push_back(case_, allocator);
           next->finalize();
           top = next;
           nameMapper.popLabelName(name);
@@ -2178,7 +2178,7 @@
       } else {
         // we can't switch, make an if-chain instead of br_table
         auto var = Builder::addVar(function, br->condition->type);
-        top->list.push_back(builder.makeSetLocal(var, br->condition));
+        top->list.push_back(builder.makeSetLocal(var, br->condition), allocator);
         auto* brHolder = top;
         If* chain = nullptr;
         If* first = nullptr;
@@ -2207,8 +2207,8 @@
           }
           auto next = allocator.alloc<Block>();
           top->name = name;
-          next->list.push_back(top);
-          next->list.push_back(case_);
+          next->list.push_back(top, allocator);
+          next->list.push_back(case_, allocator);
           next->finalize();
           top = next;
           nameMapper.popLabelName(name);
@@ -2224,7 +2224,7 @@
 
         first->ifFalse = builder.makeBreak(br->default_);
 
-        brHolder->list.push_back(chain);
+        brHolder->list.push_back(chain, allocator);
         brHolder->finalize();
       }
 
@@ -2261,7 +2261,7 @@
     if (size == 1) return process(ast[from]);
     auto block = allocator.alloc<Block>();
     for (unsigned i = from; i < ast->size(); i++) {
-      block->list.push_back(process(ast[i]));
+      block->list.push_back(process(ast[i]), allocator);
     }
     block->finalize();
     return block;
diff --git a/src/ast_utils.h b/src/ast_utils.h
index d51a01d..fb5bf50 100644
--- a/src/ast_utils.h
+++ b/src/ast_utils.h
@@ -233,16 +233,6 @@
     convert<InputType, Nop>(target);
   }
 
-  // Convert a node that allocates
-  template<typename InputType, typename OutputType>
-  static OutputType* convert(InputType *input, MixedArena& allocator) {
-    assert(sizeof(OutputType) <= sizeof(InputType));
-    input->~InputType(); // arena-allocaed, so no destructor, but avoid UB.
-    OutputType* output = (OutputType*)(input);
-    new (output) OutputType(allocator);
-    return output;
-  }
-
   template<typename T>
   static Expression* flexibleCopy(Expression* original, Module& wasm, T& custom) {
     struct Copier : public Visitor<Copier, Expression*> {
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index c618f9d..a026da4 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -300,10 +300,11 @@
 BinaryenOp BinaryenHasFeature(void) { return HasFeature; }
 
 BinaryenExpressionRef BinaryenBlock(BinaryenModuleRef module, const char* name, BinaryenExpressionRef* children, BinaryenIndex numChildren) {
-  auto* ret = ((Module*)module)->allocator.alloc<Block>();
+  auto& allocator = ((Module*)module)->allocator;
+  auto* ret = allocator.alloc<Block>();
   if (name) ret->name = name;
   for (BinaryenIndex i = 0; i < numChildren; i++) {
-    ret->list.push_back((Expression*)children[i]);
+    ret->list.push_back((Expression*)children[i], allocator);
   }
   ret->finalize();
 
@@ -362,7 +363,8 @@
   return static_cast<Expression*>(ret);
 }
 BinaryenExpressionRef BinaryenSwitch(BinaryenModuleRef module, const char **names, BinaryenIndex numNames, const char* defaultName, BinaryenExpressionRef condition, BinaryenExpressionRef value) {
-  auto* ret = ((Module*)module)->allocator.alloc<Switch>();
+  auto& allocator = ((Module*)module)->allocator;
+  auto* ret = allocator.alloc<Switch>();
 
   if (tracing) {
     std::cout << "  {\n";
@@ -379,7 +381,7 @@
   }
 
   for (BinaryenIndex i = 0; i < numNames; i++) {
-    ret->targets.push_back(names[i]);
+    ret->targets.push_back(names[i], allocator);
   }
   ret->default_ = defaultName;
   ret->condition = (Expression*)condition;
@@ -388,7 +390,8 @@
   return static_cast<Expression*>(ret);
 }
 BinaryenExpressionRef BinaryenCall(BinaryenModuleRef module, const char *target, BinaryenExpressionRef* operands, BinaryenIndex numOperands, BinaryenType returnType) {
-  auto* ret = ((Module*)module)->allocator.alloc<Call>();
+  auto& allocator = ((Module*)module)->allocator;
+  auto* ret = allocator.alloc<Call>();
 
   if (tracing) {
     std::cout << "  {\n";
@@ -406,14 +409,15 @@
 
   ret->target = target;
   for (BinaryenIndex i = 0; i < numOperands; i++) {
-    ret->operands.push_back((Expression*)operands[i]);
+    ret->operands.push_back((Expression*)operands[i], allocator);
   }
   ret->type = WasmType(returnType);
   ret->finalize();
   return static_cast<Expression*>(ret);
 }
 BinaryenExpressionRef BinaryenCallImport(BinaryenModuleRef module, const char *target, BinaryenExpressionRef* operands, BinaryenIndex numOperands, BinaryenType returnType) {
-  auto* ret = ((Module*)module)->allocator.alloc<CallImport>();
+  auto& allocator = ((Module*)module)->allocator;
+  auto* ret = allocator.alloc<CallImport>();
 
   if (tracing) {
     std::cout << "  {\n";
@@ -431,7 +435,7 @@
 
   ret->target = target;
   for (BinaryenIndex i = 0; i < numOperands; i++) {
-    ret->operands.push_back((Expression*)operands[i]);
+    ret->operands.push_back((Expression*)operands[i], allocator);
   }
   ret->type = WasmType(returnType);
   ret->finalize();
@@ -439,7 +443,8 @@
 }
 BinaryenExpressionRef BinaryenCallIndirect(BinaryenModuleRef module, BinaryenExpressionRef target, BinaryenExpressionRef* operands, BinaryenIndex numOperands, const char* type) {
   auto* wasm = (Module*)module;
-  auto* ret = wasm->allocator.alloc<CallIndirect>();
+  auto& allocator = wasm->allocator;
+  auto* ret = allocator.alloc<CallIndirect>();
 
   if (tracing) {
     std::cout << "  {\n";
@@ -457,7 +462,7 @@
 
   ret->target = (Expression*)target;
   for (BinaryenIndex i = 0; i < numOperands; i++) {
-    ret->operands.push_back((Expression*)operands[i]);
+    ret->operands.push_back((Expression*)operands[i], allocator);
   }
   ret->fullType = type;
   ret->type = wasm->getFunctionType(ret->fullType)->result;
@@ -625,11 +630,12 @@
     std::cout << "  TODO: host...\n";
   }
 
-  auto* ret = ((Module*)module)->allocator.alloc<Host>();
+  auto& allocator = ((Module*)module)->allocator;
+  auto* ret = allocator.alloc<Host>();
   ret->op = HostOp(op);
   if (name) ret->nameOperand = name;
   for (BinaryenIndex i = 0; i < numOperands; i++) {
-    ret->operands.push_back((Expression*)operands[i]);
+    ret->operands.push_back((Expression*)operands[i], allocator);
   }
   ret->finalize();
   return static_cast<Expression*>(ret);
diff --git a/src/cfg/Relooper.cpp b/src/cfg/Relooper.cpp
index d412c7b..51a59d0 100644
--- a/src/cfg/Relooper.cpp
+++ b/src/cfg/Relooper.cpp
@@ -58,7 +58,7 @@
       Shape* Body = iter.second;
       Curr->name = Builder.getBlockBreakName(Id);
       auto* Outer = Builder.makeBlock(Curr);
-      Outer->list.push_back(Body->Render(Builder, InLoop));
+      Outer->list.push_back(Body->Render(Builder, InLoop), Builder.allocator);
       Outer->finalize(); // TODO: not really necessary
       Curr = Outer;
     }
@@ -106,13 +106,13 @@
 
 wasm::Expression* Branch::Render(RelooperBuilder& Builder, Block *Target, bool SetLabel) {
   auto* Ret = Builder.makeBlock();
-  if (Code) Ret->list.push_back(Code);
-  if (SetLabel) Ret->list.push_back(Builder.makeSetLabel(Target->Id));
+  if (Code) Ret->list.push_back(Code, Builder.allocator);
+  if (SetLabel) Ret->list.push_back(Builder.makeSetLabel(Target->Id), Builder.allocator);
   if (Type == Break) {
-    Ret->list.push_back(Builder.makeBlockBreak(Target->Id));
+    Ret->list.push_back(Builder.makeBlockBreak(Target->Id), Builder.allocator);
   } else if (Type == Continue) {
     assert(Ancestor);
-    Ret->list.push_back(Builder.makeShapeContinue(Ancestor->Id));
+    Ret->list.push_back(Builder.makeShapeContinue(Ancestor->Id), Builder.allocator);
   }
   Ret->finalize();
   return Ret;
@@ -144,9 +144,9 @@
 wasm::Expression* Block::Render(RelooperBuilder& Builder, bool InLoop) {
   auto* Ret = Builder.makeBlock();
   if (IsCheckedMultipleEntry && InLoop) {
-    Ret->list.push_back(Builder.makeSetLabel(0));
+    Ret->list.push_back(Builder.makeSetLabel(0), Builder.allocator);
   }
-  if (Code) Ret->list.push_back(Code);
+  if (Code) Ret->list.push_back(Code, Builder.allocator);
 
   if (!ProcessedBranchesOut.size()) {
     Ret->finalize();
@@ -306,10 +306,10 @@
       // generate a block to branch to, if we have content
       if (CurrContent) {
         auto* NextOuter = Builder.makeBlock();
-        NextOuter->list.push_back(Outer);
+        NextOuter->list.push_back(Outer, Builder.allocator);
         Outer->name = CurrName; // breaking on Outer leads to the content in NextOuter
-        NextOuter->list.push_back(CurrContent);
-        NextOuter->list.push_back(Builder.makeBreak(SwitchLeave));
+        NextOuter->list.push_back(CurrContent, Builder.allocator);
+        NextOuter->list.push_back(Builder.makeBreak(SwitchLeave), Builder.allocator);
         // prepare for more nesting
         Outer = NextOuter;
       } else {
@@ -331,12 +331,12 @@
     }
     // finish up the whole pattern
     Outer->name = SwitchLeave;
-    Inner->list.push_back(Builder.makeSwitch(Table, SwitchDefault, SwitchCondition));
+    Inner->list.push_back(Builder.makeSwitch(Table, SwitchDefault, SwitchCondition), Builder.allocator);
     Root = Outer;
   }
 
   if (Root) {
-    Ret->list.push_back(Root);
+    Ret->list.push_back(Root, Builder.allocator);
   }
   Ret->finalize();
 
diff --git a/src/mixed_arena.h b/src/mixed_arena.h
index 081d5ec..5bf94e5 100644
--- a/src/mixed_arena.h
+++ b/src/mixed_arena.h
@@ -168,7 +168,7 @@
 public:
   ArenaVector() {}
   ArenaVector(ArenaVector<T>&& other) {
-    *this = other;
+    *this = std::move(other);
   }
 
   T& operator[](size_t index) const {
@@ -222,10 +222,6 @@
     usedElements = size;
   }
 
-  void operator=(ArenaVector<T>& other) {
-    set(other);
-  }
-
   void operator=(ArenaVector<T>&& other) {
     data = other.data;
     usedElements = other.usedElements;
diff --git a/src/passes/DeadCodeElimination.cpp b/src/passes/DeadCodeElimination.cpp
index 878384d..f7fe617 100644
--- a/src/passes/DeadCodeElimination.cpp
+++ b/src/passes/DeadCodeElimination.cpp
@@ -121,7 +121,7 @@
         // it would leave an element with type none as the last, that could be a problem,
         // see https://github.com/WebAssembly/spec/issues/355
         if (!(isConcreteWasmType(block->type) && block->list[i]->type == none)) {
-          block->list.resize(i + 1, self->getModule()->allocator);
+          block->list.resize(i + 1, self->getAllocator());
           // note that we do *not* finalize here. it is incorrect to re-finalize a block
           // after removing elements, as it may no longer have branches to it that would
           // determine its type, so re-finalizing would just wipe out an existing type
@@ -247,9 +247,9 @@
     for (Index i = 0; i < curr->operands.size(); i++) {
       if (isDead(curr->operands[i])) {
         if (i > 0) {
-          auto* block = getModule()->allocator.alloc<Block>();
+          auto* block = getAllocator().alloc<Block>();
           Index newSize = i + 1;
-          block->list.resize(newSize, getModule()->allocator);
+          block->list.resize(newSize, getAllocator());
           Index j = 0;
           for (; j < newSize; j++) {
             block->list[j] = drop(curr->operands[j]);
@@ -275,11 +275,11 @@
   void visitCallIndirect(CallIndirect* curr) {
     if (handleCall(curr) != curr) return;
     if (isDead(curr->target)) {
-      auto* block = getModule()->allocator.alloc<Block>();
+      auto* block = getAllocator().alloc<Block>();
       for (auto* operand : curr->operands) {
-        block->list.push_back(drop(operand), getModule()->allocator);
+        block->list.push_back(drop(operand), getAllocator());
       }
-      block->list.push_back(curr->target, getModule()->allocator);
+      block->list.push_back(curr->target, getAllocator());
       block->finalize();
       replaceCurrent(block);
     }
@@ -303,8 +303,8 @@
       return;
     }
     if (isDead(curr->value)) {
-      auto* block = getModule()->allocator.alloc<Block>();
-      block->list.resize(2, getModule()->allocator);
+      auto* block = getAllocator().alloc<Block>();
+      block->list.resize(2, getAllocator());
       block->list[0] = drop(curr->ptr);
       block->list[1] = curr->value;
       block->finalize();
@@ -324,8 +324,8 @@
       return;
     }
     if (isDead(curr->right)) {
-      auto* block = getModule()->allocator.alloc<Block>();
-      block->list.resize(2, getModule()->allocator);
+      auto* block = getAllocator().alloc<Block>();
+      block->list.resize(2, getAllocator());
       block->list[0] = drop(curr->left);
       block->list[1] = curr->right;
       block->finalize();
@@ -339,8 +339,8 @@
       return;
     }
     if (isDead(curr->ifFalse)) {
-      auto* block = getModule()->allocator.alloc<Block>();
-      block->list.resize(2, getModule()->allocator);
+      auto* block = getAllocator().alloc<Block>();
+      block->list.resize(2, getAllocator());
       block->list[0] = drop(curr->ifTrue);
       block->list[1] = curr->ifFalse;
       block->finalize();
@@ -348,8 +348,8 @@
       return;
     }
     if (isDead(curr->condition)) {
-      auto* block = getModule()->allocator.alloc<Block>();
-      block->list.resize(3, getModule()->allocator);
+      auto* block = getAllocator().alloc<Block>();
+      block->list.resize(3, getAllocator());
       block->list[0] = drop(curr->ifTrue);
       block->list[1] = drop(curr->ifFalse);
       block->list[2] = curr->condition;
diff --git a/src/passes/LegalizeJSInterface.cpp b/src/passes/LegalizeJSInterface.cpp
index 6e07015..6e33fae 100644
--- a/src/passes/LegalizeJSInterface.cpp
+++ b/src/passes/LegalizeJSInterface.cpp
@@ -124,14 +124,14 @@
 
     for (auto param : func->params) {
       if (param == i64) {
-        call->operands.push_back(I64Utilities::recreateI64(builder, legal->params.size(), legal->params.size() + 1));
+        call->operands.push_back(I64Utilities::recreateI64(builder, legal->params.size(), legal->params.size() + 1), module->allocator);
         legal->params.push_back(i32);
         legal->params.push_back(i32);
       } else if (param == f32) {
-        call->operands.push_back(builder.makeUnary(DemoteFloat64, builder.makeGetLocal(legal->params.size(), f64)));
+        call->operands.push_back(builder.makeUnary(DemoteFloat64, builder.makeGetLocal(legal->params.size(), f64)), module->allocator);
         legal->params.push_back(f64);
       } else {
-        call->operands.push_back(builder.makeGetLocal(legal->params.size(), param));
+        call->operands.push_back(builder.makeGetLocal(legal->params.size(), param), module->allocator);
         legal->params.push_back(param);
       }
     }
@@ -140,13 +140,13 @@
       legal->result = i32;
       auto index = builder.addVar(legal, Name(), i64);
       auto* block = builder.makeBlock();
-      block->list.push_back(builder.makeSetLocal(index, call));
+      block->list.push_back(builder.makeSetLocal(index, call), module->allocator);
       ensureTempRet0(module);
       block->list.push_back(builder.makeSetGlobal(
         TEMP_RET_0,
         I64Utilities::getI64High(builder, index)
-      ));
-      block->list.push_back(I64Utilities::getI64Low(builder, index));
+      ), module->allocator);
+      block->list.push_back(I64Utilities::getI64Low(builder, index), module->allocator);
       block->finalize();
       legal->body = block;
     } else if (func->result == f32) {
@@ -184,15 +184,15 @@
 
     for (auto param : im->functionType->params) {
       if (param == i64) {
-        call->operands.push_back(I64Utilities::getI64Low(builder, func->params.size()));
-        call->operands.push_back(I64Utilities::getI64High(builder, func->params.size()));
+        call->operands.push_back(I64Utilities::getI64Low(builder, func->params.size()), module->allocator);
+        call->operands.push_back(I64Utilities::getI64High(builder, func->params.size()), module->allocator);
         type->params.push_back(i32);
         type->params.push_back(i32);
       } else if (param == f32) {
-        call->operands.push_back(builder.makeUnary(PromoteFloat32, builder.makeGetLocal(func->params.size(), f32)));
+        call->operands.push_back(builder.makeUnary(PromoteFloat32, builder.makeGetLocal(func->params.size(), f32)), module->allocator);
         type->params.push_back(f64);
       } else {
-        call->operands.push_back(builder.makeGetLocal(func->params.size(), param));
+        call->operands.push_back(builder.makeGetLocal(func->params.size(), param), module->allocator);
         type->params.push_back(param);
       }
       func->params.push_back(param);
diff --git a/src/passes/MergeBlocks.cpp b/src/passes/MergeBlocks.cpp
index 467ffb4..072f86e 100644
--- a/src/passes/MergeBlocks.cpp
+++ b/src/passes/MergeBlocks.cpp
@@ -180,17 +180,17 @@
       }
       if (!child) continue;
       if (child->name.is()) continue; // named blocks can have breaks to them (and certainly do, if we ran RemoveUnusedNames and RemoveUnusedBrs)
-      ExpressionList merged(module->allocator);
+      ExpressionList merged;
       for (size_t j = 0; j < i; j++) {
-        merged.push_back(curr->list[j]);
+        merged.push_back(curr->list[j], module->allocator);
       }
       for (auto item : child->list) {
-        merged.push_back(item);
+        merged.push_back(item, module->allocator);
       }
       for (size_t j = i + 1; j < curr->list.size(); j++) {
-        merged.push_back(curr->list[j]);
+        merged.push_back(curr->list[j], module->allocator);
       }
-      curr->list = merged;
+      curr->list.set(merged, module->allocator);
       more = true;
       changed = true;
       break;
@@ -234,9 +234,9 @@
           assert(outer->list.back() == curr);
           outer->list.pop_back();
           for (Index i = 0; i < block->list.size() - 1; i++) {
-            outer->list.push_back(block->list[i]);
+            outer->list.push_back(block->list[i], getAllocator());
           }
-          outer->list.push_back(curr);
+          outer->list.push_back(curr, getAllocator());
         }
       }
     }
diff --git a/src/passes/RemoveUnusedBrs.cpp b/src/passes/RemoveUnusedBrs.cpp
index 69a7c4f..3ccdb07 100644
--- a/src/passes/RemoveUnusedBrs.cpp
+++ b/src/passes/RemoveUnusedBrs.cpp
@@ -115,7 +115,7 @@
         }
         // drop a nop at the end of a block, which prevents a value flowing
         while (block->list.size() > 0 && block->list.back()->is<Nop>()) {
-          block->list.resize(block->list.size() - 1);
+          block->list.resize(block->list.size() - 1, self->getAllocator());
           self->anotherCycle = true;
         }
       }
@@ -411,7 +411,7 @@
             ifTrueBreak->condition = iff->condition;
             ifTrueBreak->finalize();
             list[i] = Builder(*getModule()).dropIfConcretelyTyped(ifTrueBreak);
-            ExpressionManipulator::spliceIntoBlock(curr, i + 1, iff->ifFalse);
+            ExpressionManipulator::spliceIntoBlock(curr, i + 1, iff->ifFalse, getAllocator());
             continue;
           }
           // otherwise, perhaps we can flip the if
@@ -420,7 +420,7 @@
             ifFalseBreak->condition = Builder(*getModule()).makeUnary(EqZInt32, iff->condition);
             ifFalseBreak->finalize();
             list[i] = Builder(*getModule()).dropIfConcretelyTyped(ifFalseBreak);
-            ExpressionManipulator::spliceIntoBlock(curr, i + 1, iff->ifTrue);
+            ExpressionManipulator::spliceIntoBlock(curr, i + 1, iff->ifTrue, getAllocator());
             continue;
           }
         }
diff --git a/src/passes/SimplifyLocals.cpp b/src/passes/SimplifyLocals.cpp
index 6509c9d..6f2f527 100644
--- a/src/passes/SimplifyLocals.cpp
+++ b/src/passes/SimplifyLocals.cpp
@@ -352,7 +352,7 @@
       if (br->condition) {
         br->value = set;
         set->setTee(true);
-        *breakSetLocalPointer = getModule()->allocator.alloc<Nop>();
+        *breakSetLocalPointer = getAllocator().alloc<Nop>();
         // in addition, as this is a conditional br that now has a value, it now returns a value, so it must be dropped
         br->finalize();
         *brp = Builder(*getModule()).makeDrop(br);
@@ -456,7 +456,7 @@
       // enlarge blocks that were marked, for the next round
       if (blocksToEnlarge.size() > 0) {
         for (auto* block : blocksToEnlarge) {
-          block->list.push_back(getModule()->allocator.alloc<Nop>());
+          block->list.push_back(getAllocator().alloc<Nop>(), getAllocator());
         }
         blocksToEnlarge.clear();
         anotherCycle = true;
@@ -467,12 +467,12 @@
           auto ifTrue = Builder(*getModule()).blockify(iff->ifTrue);
           iff->ifTrue = ifTrue;
           if (ifTrue->list.size() == 0 || !ifTrue->list.back()->is<Nop>()) {
-            ifTrue->list.push_back(getModule()->allocator.alloc<Nop>());
+            ifTrue->list.push_back(getAllocator().alloc<Nop>(), getAllocator());
           }
           auto ifFalse = Builder(*getModule()).blockify(iff->ifFalse);
           iff->ifFalse = ifFalse;
           if (ifFalse->list.size() == 0 || !ifFalse->list.back()->is<Nop>()) {
-            ifFalse->list.push_back(getModule()->allocator.alloc<Nop>());
+            ifFalse->list.push_back(getAllocator().alloc<Nop>(), getAllocator());
           }
         }
         ifsToEnlarge.clear();
diff --git a/src/passes/Vacuum.cpp b/src/passes/Vacuum.cpp
index 8d9bb42..6906624 100644
--- a/src/passes/Vacuum.cpp
+++ b/src/passes/Vacuum.cpp
@@ -158,10 +158,10 @@
         Switch* sw = list[z - skip]->dynCast<Switch>();
         if ((br && !br->condition) || sw) {
           auto* last = list.back();
-          list.resize(z - skip + 1);
+          list.resize(z - skip + 1, getAllocator());
           // if we removed the last one, and it was a return value, it must be returned
           if (list.back() != last && isConcreteWasmType(last->type)) {
-            list.push_back(last);
+            list.push_back(last, getAllocator());
           }
           needResize = false;
           break;
@@ -169,7 +169,7 @@
       }
     }
     if (needResize) {
-      list.resize(size - skip);
+      list.resize(size - skip, getAllocator());
     }
     if (!curr->name.is()) {
       if (list.size() == 1) {
diff --git a/src/s2wasm.h b/src/s2wasm.h
index faa31ae..a6068ad 100644
--- a/src/s2wasm.h
+++ b/src/s2wasm.h
@@ -740,12 +740,12 @@
     // parse body
     func->body = allocator->alloc<Block>();
     std::vector<Expression*> bstack;
-    auto addToBlock = [&bstack](Expression* curr) {
+    auto addToBlock = [&bstack, this](Expression* curr) {
       Expression* last = bstack.back();
       if (last->is<Loop>()) {
         last = last->cast<Loop>()->body;
       }
-      last->cast<Block>()->list.push_back(curr);
+      last->cast<Block>()->list.push_back(curr, *allocator);
     };
     bstack.push_back(func->body);
     std::vector<Expression*> estack;
@@ -874,7 +874,7 @@
       Name assign = getAssign();
       auto curr = allocator->alloc<Host>();
       curr->op = op;
-      curr->operands.push_back(getInput());
+      curr->operands.push_back(getInput(), *allocator);
       curr->finalize();
       setOutput(curr, assign);
     };
@@ -976,7 +976,7 @@
           int num = getNumInputs();
           auto inputs = getInputs(num);
           for (int i = 0; i < num; i++) {
-            curr->operands.push_back(inputs[i]);
+            curr->operands.push_back(inputs[i], *allocator);
           }
         }
         Name target = linkerObj->resolveAlias(
@@ -1203,7 +1203,7 @@
         auto curr = allocator->alloc<Switch>();
         curr->condition = getInput();
         while (skipComma()) {
-          curr->targets.push_back(getBranchLabel(getInt()));
+          curr->targets.push_back(getBranchLabel(getInt()), *allocator);
         }
         assert(curr->targets.size() > 0);
         curr->default_ = curr->targets.back();
diff --git a/src/wasm-builder.h b/src/wasm-builder.h
index ac43a4b..e7d473d 100644
--- a/src/wasm-builder.h
+++ b/src/wasm-builder.h
@@ -33,12 +33,12 @@
 // General AST node builder
 
 class Builder {
-  MixedArena& allocator;
-
 public:
   Builder(MixedArena& allocator) : allocator(allocator) {}
   Builder(Module& wasm) : allocator(wasm.allocator) {}
 
+  MixedArena& allocator;
+
   // make* functions, create nodes
 
   Function* makeFunction(Name name,
diff --git a/src/wasm-linker.cpp b/src/wasm-linker.cpp
index 757fc88..037dfa1 100644
--- a/src/wasm-linker.cpp
+++ b/src/wasm-linker.cpp
@@ -84,7 +84,7 @@
       auto type = call->type;
       auto operands = std::move(call->operands);
       auto target = call->target;
-      CallImport* newCall = ExpressionManipulator::convert<Call, CallImport>(call, out.wasm.allocator);
+      CallImport* newCall = ExpressionManipulator::convert<Call, CallImport>(call);
       newCall->type = type;
       newCall->operands = std::move(operands);
       newCall->target = target;
@@ -241,7 +241,7 @@
       auto* call = builder.makeCall(startFunction, args, target->result);
       Expression* e = call;
       if (target->result != none) e = builder.makeDrop(call);
-      block->list.push_back(e);
+      block->list.push_back(e, builder.allocator);
       block->finalize();
     }
   }
diff --git a/src/wasm-traversal.h b/src/wasm-traversal.h
index 0b8097f..bf89166 100644
--- a/src/wasm-traversal.h
+++ b/src/wasm-traversal.h
@@ -170,6 +170,11 @@
     return currFunction;
   }
 
+  // Convenience function to get the allocator
+  MixedArena& getAllocator() {
+    return currModule->allocator;
+  }
+
   // Walk starting
 
   void walkFunction(Function* func) {
