     # argument.
     exprs = @body.expressions
     for param in @params
-      for arg in param.variables
-        if arg.binding.onStack
-          arg.save = freshVariable arg.name
-          plh = new Value new Literal arg.name
-          prh = new Value arg.save
-          asn = new Assign plh, prh
-          asn.computedType = plh.computedType = prh.computedType = arg.type
-          plh.computedBinding = arg.binding
-          exprs.unshift asn
+      for arg in param.variables when arg.binding.onStack
+        plh = new Value new Literal arg.name
+        prh = new Value new Literal arg.name
+        asn = new Assign plh, prh
+        asn.computedType = plh.computedType = prh.computedType = arg.type
+        plh.computedBinding = arg.binding
+        exprs.unshift asn
     o.frameSize = frameSize
-    stackFence o, exprs, frameSize, @spOffsets
-    for param in @params
-      for { name, save } in param.variables
-        exprs.unshift new Assign new Value(save), new Value new Literal name
+    stackFence o, exprs, frameSize
   return
 
 # Add SP computation and pointer conversions to explicit returns.

Code::computeType = (r, o) ->
  return @computedType if @typeCached
  @typeCached = true
  # Cache the stack-allocated variables and their offsets.
  @spOffsets = spOffsets o.scope
  @frameSize = o.scope.frameSize
  # Arriving in this function means that all the parameters typechecked, since
  # this is called after the body has been processed. So we just need to

    exprs = @expressions
    if frameSize = @frameSize
      o.frameSize = frameSize
      stackFence o, exprs, frameSize, yes
    # Bring in `malloc` if this module needs it.
    if scope.needsMalloc
      obj = new Value new Obj [MALLOC, FREE]
