diff options
Diffstat (limited to 'llvm/lib/Support/Z3Solver.cpp')
-rw-r--r-- | llvm/lib/Support/Z3Solver.cpp | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/llvm/lib/Support/Z3Solver.cpp b/llvm/lib/Support/Z3Solver.cpp index a83d0f441a4bd..9485536d13120 100644 --- a/llvm/lib/Support/Z3Solver.cpp +++ b/llvm/lib/Support/Z3Solver.cpp @@ -6,6 +6,7 @@ // //===----------------------------------------------------------------------===// +#include "llvm/ADT/SmallString.h" #include "llvm/ADT/Twine.h" #include "llvm/Config/config.h" #include "llvm/Support/SMTAPI.h" @@ -516,16 +517,16 @@ public: SMTExprRef RoundingMode = getFloatRoundingMode(); return newExprRef( Z3Expr(Context, - Z3_mk_fpa_mul(Context.Context, toZ3Expr(*LHS).AST, - toZ3Expr(*RHS).AST, toZ3Expr(*RoundingMode).AST))); + Z3_mk_fpa_mul(Context.Context, toZ3Expr(*RoundingMode).AST, + toZ3Expr(*LHS).AST, toZ3Expr(*RHS).AST))); } SMTExprRef mkFPDiv(const SMTExprRef &LHS, const SMTExprRef &RHS) override { SMTExprRef RoundingMode = getFloatRoundingMode(); return newExprRef( Z3Expr(Context, - Z3_mk_fpa_div(Context.Context, toZ3Expr(*LHS).AST, - toZ3Expr(*RHS).AST, toZ3Expr(*RoundingMode).AST))); + Z3_mk_fpa_div(Context.Context, toZ3Expr(*RoundingMode).AST, + toZ3Expr(*LHS).AST, toZ3Expr(*RHS).AST))); } SMTExprRef mkFPRem(const SMTExprRef &LHS, const SMTExprRef &RHS) override { @@ -538,16 +539,16 @@ public: SMTExprRef RoundingMode = getFloatRoundingMode(); return newExprRef( Z3Expr(Context, - Z3_mk_fpa_add(Context.Context, toZ3Expr(*LHS).AST, - toZ3Expr(*RHS).AST, toZ3Expr(*RoundingMode).AST))); + Z3_mk_fpa_add(Context.Context, toZ3Expr(*RoundingMode).AST, + toZ3Expr(*LHS).AST, toZ3Expr(*RHS).AST))); } SMTExprRef mkFPSub(const SMTExprRef &LHS, const SMTExprRef &RHS) override { SMTExprRef RoundingMode = getFloatRoundingMode(); return newExprRef( Z3Expr(Context, - Z3_mk_fpa_sub(Context.Context, toZ3Expr(*LHS).AST, - toZ3Expr(*RHS).AST, toZ3Expr(*RoundingMode).AST))); + Z3_mk_fpa_sub(Context.Context, toZ3Expr(*RoundingMode).AST, + toZ3Expr(*LHS).AST, toZ3Expr(*RHS).AST))); } SMTExprRef mkFPLt(const SMTExprRef &LHS, const SMTExprRef &RHS) override { @@ -723,10 +724,25 @@ public: } SMTExprRef mkBitvector(const llvm::APSInt Int, unsigned BitWidth) override { - const SMTSortRef Sort = getBitvectorSort(BitWidth); - return newExprRef( - Z3Expr(Context, Z3_mk_numeral(Context.Context, Int.toString(10).c_str(), - toZ3Sort(*Sort).Sort))); + const Z3_sort Z3Sort = toZ3Sort(*getBitvectorSort(BitWidth)).Sort; + + // Slow path, when 64 bits are not enough. + if (LLVM_UNLIKELY(Int.getBitWidth() > 64u)) { + SmallString<40> Buffer; + Int.toString(Buffer, 10); + return newExprRef(Z3Expr( + Context, Z3_mk_numeral(Context.Context, Buffer.c_str(), Z3Sort))); + } + + const int64_t BitReprAsSigned = Int.getExtValue(); + const uint64_t BitReprAsUnsigned = + reinterpret_cast<const uint64_t &>(BitReprAsSigned); + + Z3_ast Literal = + Int.isSigned() + ? Z3_mk_int64(Context.Context, BitReprAsSigned, Z3Sort) + : Z3_mk_unsigned_int64(Context.Context, BitReprAsUnsigned, Z3Sort); + return newExprRef(Z3Expr(Context, Literal)); } SMTExprRef mkFloat(const llvm::APFloat Float) override { |