From: Chris Lattner Date: Sun, 20 Apr 2008 00:26:06 +0000 (+0000) Subject: Use simplified ConstantFP::get method, fix a bug handling frem x, 0 with long doubles. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=eb9c8e1e3fd81607f8aa71f2b8b1592d6d333337;p=oota-llvm.git Use simplified ConstantFP::get method, fix a bug handling frem x, 0 with long doubles. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@49976 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/VMCore/ConstantFold.cpp b/lib/VMCore/ConstantFold.cpp index 353a1492f80..ffc8f027805 100644 --- a/lib/VMCore/ConstantFold.cpp +++ b/lib/VMCore/ConstantFold.cpp @@ -150,7 +150,7 @@ static Constant *FoldBitCast(Constant *V, const Type *DestTy) { if (DestTy->isFloatingPoint()) { assert((DestTy == Type::DoubleTy || DestTy == Type::FloatTy) && "Unknown FP type!"); - return ConstantFP::get(DestTy, APFloat(CI->getValue())); + return ConstantFP::get(APFloat(CI->getValue())); } // Otherwise, can't fold this (vector?) return 0; @@ -220,7 +220,7 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, const Constant *V, DestTy == Type::FP128Ty ? APFloat::IEEEquad : APFloat::Bogus, APFloat::rmNearestTiesToEven); - return ConstantFP::get(DestTy, Val); + return ConstantFP::get(Val); } return 0; // Can't fold. case Instruction::FPToUI: @@ -262,7 +262,7 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, const Constant *V, (void)apf.convertFromAPInt(api, opc==Instruction::SIToFP, APFloat::rmNearestTiesToEven); - return ConstantFP::get(DestTy, apf); + return ConstantFP::get(apf); } if (const ConstantVector *CV = dyn_cast(V)) { std::vector res; @@ -703,30 +703,34 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode, APFloat C1V = CFP1->getValueAPF(); APFloat C2V = CFP2->getValueAPF(); APFloat C3V = C1V; // copy for modification - bool isDouble = CFP1->getType()==Type::DoubleTy; switch (Opcode) { default: break; case Instruction::Add: (void)C3V.add(C2V, APFloat::rmNearestTiesToEven); - return ConstantFP::get(CFP1->getType(), C3V); + return ConstantFP::get(C3V); case Instruction::Sub: (void)C3V.subtract(C2V, APFloat::rmNearestTiesToEven); - return ConstantFP::get(CFP1->getType(), C3V); + return ConstantFP::get(C3V); case Instruction::Mul: (void)C3V.multiply(C2V, APFloat::rmNearestTiesToEven); - return ConstantFP::get(CFP1->getType(), C3V); + return ConstantFP::get(C3V); case Instruction::FDiv: (void)C3V.divide(C2V, APFloat::rmNearestTiesToEven); - return ConstantFP::get(CFP1->getType(), C3V); + return ConstantFP::get(C3V); case Instruction::FRem: - if (C2V.isZero()) + if (C2V.isZero()) { // IEEE 754, Section 7.1, #5 - return ConstantFP::get(CFP1->getType(), isDouble ? - APFloat(std::numeric_limits::quiet_NaN()) : - APFloat(std::numeric_limits::quiet_NaN())); + if (CFP1->getType() == Type::DoubleTy) + return ConstantFP::get(APFloat(std::numeric_limits:: + quiet_NaN())); + if (CFP1->getType() == Type::FloatTy) + return ConstantFP::get(APFloat(std::numeric_limits:: + quiet_NaN())); + break; + } (void)C3V.mod(C2V, APFloat::rmNearestTiesToEven); - return ConstantFP::get(CFP1->getType(), C3V); + return ConstantFP::get(C3V); } } } else if (const VectorType *VTy = dyn_cast(C1->getType())) { diff --git a/lib/VMCore/Core.cpp b/lib/VMCore/Core.cpp index 906397791ba..ad72095fe5d 100644 --- a/lib/VMCore/Core.cpp +++ b/lib/VMCore/Core.cpp @@ -307,12 +307,11 @@ static const fltSemantics &SemanticsForType(Type *Ty) { LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N) { APFloat APN(N); APN.convert(SemanticsForType(unwrap(RealTy)), APFloat::rmNearestTiesToEven); - return wrap(ConstantFP::get(unwrap(RealTy), APN)); + return wrap(ConstantFP::get(APN)); } LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text) { - return wrap(ConstantFP::get(unwrap(RealTy), - APFloat(SemanticsForType(unwrap(RealTy)), Text))); + return wrap(ConstantFP::get(APFloat(SemanticsForType(unwrap(RealTy)), Text))); } /*--.. Operations on composite constants ...................................--*/