anchor.diff:          HInstruction nextInput = expectedInputs.removeLast();
           assert(!generateAtUseSite.contains(nextInput));
           assert(nextInput.usedBy.length == 1);
  -        if (nextInput == instruction) {
  +        if (nextInput === instruction) {
             return true;
           }
         }
         return false;
  +    }
  +
  +    for (HBasicBlock successor in block.successors) {
  +      // Only add the input of the first phi. Making inputs of
  +      // later phis generate-at-use-site would make them move
  +      // accross the assignment of the first phi, and we need
  +      // more analysis before we can do that.
  +      HPhi phi = successor.phis.first;
  +      if (phi != null) {
  +        int index = successor.predecessors.indexOf(block);
  +        HInstruction input = phi.inputs[index];
  +        if (!generateAtUseSite.contains(input)
  +            && !input.isCodeMotionInvariant()
  +            && input.usedBy.length == 1
  +            && input is! HPhi) {
  +          expectedInputs.add(input);
  +        }
  +        break;
  +      }
       }
   
       block.last.accept(this);
  
positive.code: 
      if (block.predecessors.length === 1
          && isBlockSinglePredecessor(block.predecessors[0])) {
        tryMergingExpressions(block.predecessors[0]);
      } else {
        expectedInputs = null;
  
negative.code: 
    bool usedOnlyByPhis(instruction) {
      for (HInstruction user in instruction.usedBy) {
        if (user is! HPhi) return false;
      }
      return true;
    }
  