NumberState CheckForOpOverflow(NumberKind opKind, LLVMValueRef result) { if (opKind.IsSigned()) { var lessThan = LLVM.ConstICmp(LLVMIntPredicate.LLVMIntSLT, result, MinLongLLVMValue).ConstIntGetZExtValue() == 1; if (lessThan) { return(NumberState.Underflow); } var greatherThan = LLVM.ConstICmp(LLVMIntPredicate.LLVMIntSGT, result, MaxLongLLVMValue).ConstIntGetZExtValue() == 1; if (greatherThan) { return(NumberState.Overflow); } var overflows = CheckForOverflow(result.ConstIntGetSExtValue(), opKind); if (overflows == 1) { return(NumberState.Overflow); } else if (overflows == -1) { return(NumberState.Underflow); } else { return(NumberState.Ok); } } else { var greatherThan = LLVM.ConstICmp(LLVMIntPredicate.LLVMIntUGT, result, MaxULongLLVMValue).ConstIntGetZExtValue() == 1; if (greatherThan) { return(NumberState.Overflow); } var overflows = CheckForOverflow(result.ConstIntGetZExtValue(), opKind); if (overflows == 1) { return(NumberState.Overflow); } else if (overflows == -1) { return(NumberState.Underflow); } else { return(NumberState.Ok); } } }