diff options
Diffstat (limited to 'lib/CodeGen/CGBuiltin.cpp')
| -rw-r--r-- | lib/CodeGen/CGBuiltin.cpp | 6 | 
1 files changed, 5 insertions, 1 deletions
| diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp index ba54f8342f1b..35ae114c4f25 100644 --- a/lib/CodeGen/CGBuiltin.cpp +++ b/lib/CodeGen/CGBuiltin.cpp @@ -915,7 +915,11 @@ EmitCheckedMixedSignMultiply(CodeGenFunction &CGF, const clang::Expr *Op1,        Overflow = CGF.Builder.CreateOr(Overflow, TruncOverflow);      } -    Result = CGF.Builder.CreateTrunc(UnsignedResult, ResTy); +    // Negate the product if it would be negative in infinite precision. +    Result = CGF.Builder.CreateSelect( +        IsNegative, CGF.Builder.CreateNeg(UnsignedResult), UnsignedResult); + +    Result = CGF.Builder.CreateTrunc(Result, ResTy);    }    assert(Overflow && Result && "Missing overflow or result"); | 
