anchor.diff:  
     SsaLoadElimination(this.compiler);
   
  -  visitGraph(HGraph graph) {
  +  void visitGraph(HGraph graph) {
       memories = new List<MemorySet>(graph.blocks.length);
  -    visitDominatorTree(graph);
  -  }
  -
  -  visitBasicBlock(HBasicBlock block) {
  +    List<HBasicBlock> blocks = graph.blocks;
  +    for (int i = 0; i < blocks.length; i++) {
  +      HBasicBlock block = blocks[i];
  +      visitBasicBlock(block);
  +      if (block.successors.isNotEmpty && block.successors[0].isLoopHeader()) {
  +        // We've reached the ending block of a loop. Iterate over the
  +        // blocks of the loop again to take values that flow from that
  +        // ending block into account.
  +        for (int j = block.successors[0].id; j <= block.id; j++) {
  +          visitBasicBlock(blocks[j]);
  +        }
  +      }
  +    }
  +  }
  +
  +  void visitBasicBlock(HBasicBlock block) {
       if (block.predecessors.length == 0) {
         // Entry block.
         memorySet = new MemorySet(compiler);
  
positive.code:           memories[block.predecessors[i].id], block, i);
        }
      }
      memories[block.id] = memorySet;
      HInstruction instruction = block.first;
      while (instruction != null) {
  
negative.code:                             HBasicBlock block,
                              int predecessorIndex) {
      MemorySet result = new MemorySet(compiler);
      if (other == null) return result;
  
      fieldValues.forEach((element, values) {
        var otherValues = other.fieldValues[element];
        if (otherValues == null) return;
  