Bug 7458: Add a facility for discarding generated temporaries

* sources/dfmc/llvm-back-end/llvm-emit-code.dylan
  (*temporary-locals?*): New thread-local variable used to indicate
   whether ins--local should be used.
  (without-persistent-temporaries): New macro which causes temporary values
   defined within the execution of the body to be discarded afterwards.

* sources/dfmc/llvm-back-end/llvm-emit-computation.dylan
  (emit-result-assignment): Only name result values if *temporary-locals?*
   is true.
  (emit-computation on <make-cell>): Only name local cell storage
   if *temporary-locals?* is true.
Bug 7458: New dfmc-llvm-back-end multiple values bookkeeping

* sources/dfmc/llvm-back-end/llvm-mv.dylan: New file containing multiple
  values bookkeeping representation classes and operations.
  (<llvm-mv>): New abstract class.
  (<llvm-local-mv>): New class representing multiple values as a bundle
   of local SSA values.
  (op--mv-extract): New function for extracting the nth value of
   a <llvm-mv>.
  (op--mv-extract-rest): New function for extracting multiple values beyond the
   nth as a #rest vector.
  (<llvm-global-mv>): New class representing multiple values stored in the
   TEB MV area.
  (op--global-mv-struct): New utility function for emitting the construction
   of an MV struct value.

* sources/dfmc/llvm-back-end/llvm-back-end.lid: Reference llvm-mv.dylan.

* sources/dfmc/llvm-back-end/llvm-primitives-alloc.dylan
  (op--allocate-vector): New utility method for emitting the allocation
   of a <simple-object-vector>.

* sources/dfmc/llvm-back-end/llvm-emit-code.dylan
  (temporary-value, temporary-value-setter): Allow <llvm-mv> as the
   bookkeeping value of a <temporary>.
  (merge-operands-setter): Do nothing if the given temporary is #f.
  (add-merge-operands): Do nothing if the given temporary is #f. Allow
   arbitrary objects for values.

* sources/dfmc/llvm-back-end/llvm-emit-computation.dylan
  (computation-results): Remove.
  (computation-result): Remove rest-results keyword, and accept
   <llvm-mv> result values.
  (emit-result-assignment): Take a single <llvm-value> or <llvm-mv>
   rather than a sequence.
  (emit-merge-assignment): Take a vector of <temporary> and <llvm-basic-block>
   pairs, and emit phi instructions in order to merge as as an <llvm-value>,
   <llvm-local-mv>, or <llvm-global-mv> as appropriate.
  (emit-local-merge-assignment): New strategy function to merge as a
   <llvm-local-mv>.
  (emit-global-merge-assignment): New strategy function to merge as a
   llvm-global-mv>.
  (emit-computation on <function-call>): Return computation results
   computed by emit-call as a <llvm-global-mv>.
  (emit-call on <simple-call> and <&iep>): Return the result of the call.
  (emit-computation on <if>): Simplify using the new emit-merge-assignment.
  (emit-computation on <return>): Dispatch using do-emit-return.
  (do-emit-return): Return <llvm-global-mv> values directly, and
   store values from a <llvm-local-mv> in the TEB MV area.
  (emit-computation on <values>): Pull values out of a <stack-vector>
   if needed. Generate a <llvm-local-mv>.
  (emit-computation on <extract-single-value>): Extract a value from
   an <llvm-mv> using op--mv-extract.
  (emit-computation on <extract-rest-value>): Extract a #rest vector from
   an <llvm-mv> using op--mv-extract-rest.
  (emit-computation on <multiple-value-check-type>): Dispatch using
   do-emit-mv-check-type.
  (do-emit-mv-check-type): Emit type checks for MV values.
  (emit-computation on <multiple-value-check-type-rest>): Defer to
   next-method().

* sources/dfmc/llvm-back-end/llvm-back-end.dylan
  ($maximum-value-count): New constant representing the maximum size of the
   TEB MV area.

* sources/dfmc/llvm-back-end/llvm-primitives-thread.dylan
  (initialize-teb-struct-type): Change to use $maximum-value-count.
Bug 7458: Implement multiple value spilling and unspilling

* sources/dfmc/llvm-back-end/llvm-mv.dylan
  (op--protect-temporary): New function for saving a multiple-value
   temporary.
  (op--restore-temporary): New function for restoring a previously saved
   multiple-value temporary.

* sources/dfmc/llvm-back-end/llvm-emit-computation.dylan
  (emit-computation on <multiple-value-spill>): Implement using
   op--protect-temporary.
  (emit-computation on <multiple-value-unspill>): Implement using
   op--restore-temporary.
Bug 7458: Improve handling of primitives returning #rest values

* sources/dfmc/llvm-back-end/llvm-primitives.dylan
  (&primitive-descriptor-definer): Ensure that a descriptor is provided
   for primitive emitters.
  (llvm-primitive-values-rest?): New function for testing whether a
   primitive returns #rest values.
  (primitive-rest-values-test): New auxiliary function.

* sources/dfmc/llvm-back-end/llvm-emit-computation.dylan
  (emit-primitive-call): Represent results of primitives returning
   #rest values with a <llvm-global-mv> instance.
Bug 7458: Prevent duplicate local names during code generation

* sources/dfmc/llvm-back-end/llvm-emit-computation.dylan
  (emit-result-assignment): Don't define a local name for a temporary
   value if the name is already used.
  (emit-computation on <make-cell>): Don't define a local name for a
   local value cell if the name is already used.
Bug 7458: Avoid trying to add labels to non-instructions

* sources/dfmc/llvm-back-end/llvm-emit-computation.dylan
  (emit-result-assignment): Only call ins--local on instruction values.
Bug 7458: Mark code after non-returning functions as dead

* sources/dfmc/llvm-back-end/llvm-back-end-library.dylan
  (library dfmc-llvm-back-end): Import dfmc-typist.
  (module dfmc-llvm-back-end): Import dfmc-typist.

* sources/dfmc/llvm-back-end/llvm-emit-computation.dylan
  (emit-computation on <function-call>): If a function call is known
   not to return (i.e., declared as returning <bottom>), mark the
   following instruction as unreachable.