anchor.diff:    // live after the assignment (if it came from the same source variable).
     for (Block block in blocks) {
       // Group the liveOut set by source variable.
  -    Map<Local, Set<Variable>> liveOut = <Local, Set<Variable>>{};
  +    Map<String, Set<Variable>> liveOut = <String, Set<Variable>>{};
       for (Variable variable in block.liveOut) {
         liveOut.putIfAbsent(
             group(variable),
  
positive.code: ///
  /// We never merge variables that originated from distinct source variables,
  /// so we build a separate register interference graph for each source variable.
  Map<Variable, Variable> _computeRegisterAllocation(List<Block> blocks) {
    Map<Variable, Set<Variable>> interference = <Variable, Set<Variable>>{};
  
    /// Group for the given variable. We attempt to merge variables in the same
    /// group.
    /// By default, variables are grouped based on their source variable, but
    /// this can be disabled for testing purposes.
    Local group(Variable variable) {
      if (NO_PRESERVE_VARS) {
        // Parameters may not occur more than once in a parameter list,
        // so except for parameters, we try to merge all variables.
        return variable.element is ParameterElement ? variable.element : null;
      }
      return variable.element;
    }
  
    Set<Variable> empty = new Set<Variable>();
  
negative.code:       builder.build(node.parameters, body);
        _computeLiveness(builder.blocks);
        Map<Variable, Variable> subst =
            _computeRegisterAllocation(builder.blocks, node.parameters);
        new SubstituteVariables(subst).apply(node);
      });
    }
  