private void processIncrementDecrement(PsiUnaryExpression expression, PsiExpression operand, boolean postIncrement) {
    LongRangeBinOp token;
    IElementType exprTokenType = expression.getOperationTokenType();
    if (exprTokenType.equals(JavaTokenType.MINUSMINUS)) {
      token = LongRangeBinOp.MINUS;
    }
    else if (exprTokenType.equals(JavaTokenType.PLUSPLUS)) {
      token = LongRangeBinOp.PLUS;
    }
    else {
      throw new IllegalArgumentException("Unexpected token: " + exprTokenType);
    }
    PsiType operandType = operand.getType();
    PsiArrayAccessExpression arrayStore = ObjectUtils.tryCast(operand, PsiArrayAccessExpression.class);
    if (arrayStore == null) {
      operand.accept(this);
      addInstruction(new DupInstruction());
      // stack: operand, old_value
    } else {
      pushArrayAndIndex(arrayStore);
      addInstruction(new SpliceInstruction(2, 1, 0, 1, 0));
      readArrayElement(arrayStore);
      // stack: array, index, old_value
    }
    if (postIncrement) {
      if (arrayStore != null) {
        addInstruction(new SpliceInstruction(3, 0, 2, 1, 0));
        // stack: old_value, array, index, old_value
      } else {
        addInstruction(new SpliceInstruction(2, 0, 1, 0));
        // stack: old_value, operand, old_value
      }
    }
    PsiPrimitiveType unboxedType = PsiPrimitiveType.getOptionallyUnboxedType(operandType);
    if (unboxedType == null) {
      // Unknown type; likely erroneous code: replace old_value with unknown
      addInstruction(new PopInstruction());
      pushUnknown();
    } else {
      generateBoxingUnboxingInstructionFor(operand, unboxedType);
      PsiType resultType = TypeConversionUtil.binaryNumericPromotion(unboxedType, PsiTypes.intType());
      Object addend = TypeConversionUtil.computeCastTo(1, resultType);
      addInstruction(new PushValueInstruction(DfTypes.primitiveConstant(addend)));
      addInstruction(new NumericBinaryInstruction(token, null));
      if (!unboxedType.equals(resultType)) {
        addInstruction(new PrimitiveConversionInstruction(unboxedType, null));
      }
      if (!(operandType instanceof PsiPrimitiveType)) {
        addInstruction(new WrapDerivedVariableInstruction(DfTypes.typedObject(operandType, Nullability.NOT_NULL), SpecialField.UNBOX));
      }
    }
    DfaValue dest = JavaDfaValueFactory.getExpressionDfaValue(myFactory, operand);
    if (arrayStore != null) {
      addInstruction(new JavaArrayStoreInstruction(arrayStore, null, null,
                                                   ObjectUtils.tryCast(dest, DfaVariableValue.class)));
    } else {
      addInstruction(new AssignInstruction(operand, null, dest));
    }
    if (postIncrement) {
      addInstruction(new PopInstruction());
    }
    addInstruction(new ResultOfInstruction(new JavaExpressionAnchor(expression)));
  }
private void processIncrementDecrement(PsiUnaryExpression expression, PsiExpression operand, boolean postIncrement)