anchor.diff:      endExpression(JSPrecedence.LOGICAL_OR_PRECEDENCE);
     }
   
  -  void checkType(HInstruction input, Element element) {
  +  void checkType(HInstruction input, Element element, [bool negative = false]) {
       world.registerIsCheck(element);
       bool requiresNativeIsCheck =
           backend.emitter.nativeEmitter.requiresNativeIsCheck(element);
  -    if (!requiresNativeIsCheck) buffer.add('!!');
  +    if (!requiresNativeIsCheck) {
  +      if (negative) {
  +        buffer.add('!');
  +      } else {
  +        buffer.add('!!');
  +      }
  +    } else if (negative) {
  +      buffer.add('!');
  +    }
       use(input, JSPrecedence.MEMBER_PRECEDENCE);
       buffer.add('.');
       buffer.add(compiler.namer.operatorIs(element));
  
positive.code:     HInstruction input = node.guarded;
      Element indexingBehavior = compiler.jsIndexingBehaviorInterface;
      if (node.isInteger()) {
        buffer.add('if (');
        checkInt(input, '!==');
        buffer.add(') ');
        bailout(node, 'Not an integer');
      } else if (node.isNumber()) {
        buffer.add('if (');
        checkNum(input, '!==');
        buffer.add(') ');
        bailout(node, 'Not a number');
      } else if (node.isBoolean()) {
        buffer.add('if (');
        checkBool(input, '!==');
        buffer.add(') ');
        bailout(node, 'Not a boolean');
      } else if (node.isString()) {
        buffer.add('if (');
        checkString(input, '!==');
        buffer.add(') ');
        bailout(node, 'Not a string');
      } else if (node.isExtendableArray()) {
        buffer.add('if (');
        checkObject(input, '!==');
        buffer.add('||');
        checkArray(input, '!==');
        buffer.add('||');
        checkExtendableArray(input);
        buffer.add(') ');
        bailout(node, 'Not an extendable array');
      } else if (node.isMutableArray()) {
        buffer.add('if (');
        checkObject(input, '!==');
        buffer.add(' || ');
        checkArray(input, '!==');
        buffer.add(' || ');
        checkImmutableArray(input);
        buffer.add(' || !');
        checkType(input, indexingBehavior);
        buffer.add(') ');
        bailout(node, 'Not a mutable array');
      } else if (node.isReadableArray()) {
        buffer.add('if (');
        checkObject(input, '!==');
        buffer.add(' || ');
        checkArray(input, '!==');
        buffer.add(' || !');
        checkType(input, indexingBehavior);
        buffer.add(') ');
        bailout(node, 'Not an array');
      } else if (node.isIndexablePrimitive()) {
        buffer.add('if (');
        checkString(input, '!==');
        buffer.add(' && (');
        checkObject(input, '!==');
        buffer.add(' || ');
        checkArray(input, '!==');
        buffer.add(' || !');
        checkType(input, indexingBehavior);
        buffer.add(')) ');
        bailout(node, 'Not a string or array');
      } else {
        compiler.internalError('Unexpected type guard', instruction: input);
  
negative.code:     endExpression(JSPrecedence.PREFIX_PRECEDENCE);
    }
  
    void checkFixedArray(HInstruction input) {
      beginExpression(JSPrecedence.PREFIX_PRECEDENCE);
      use(input, JSPrecedence.MEMBER_PRECEDENCE);
      buffer.add('.fixed\$length');
      endExpression(JSPrecedence.PREFIX_PRECEDENCE);
    }
  
    void checkNull(HInstruction input) {
      beginExpression(JSPrecedence.EQUALITY_PRECEDENCE);
      use(input, JSPrecedence.EQUALITY_PRECEDENCE);
  