diff options
author | Dale Johannesen <dalej@apple.com> | 2009-01-21 20:32:55 +0000 |
---|---|---|
committer | Dale Johannesen <dalej@apple.com> | 2009-01-21 20:32:55 +0000 |
commit | 1f86498f9356864881356f4c6815d31e1bdeddb7 (patch) | |
tree | e5504821f989aa3d296dda3d335994580d4d2306 /llvm/lib | |
parent | e387d9ed5b6832a877a895a6449b53b2f4e816a0 (diff) | |
download | bcm5719-llvm-1f86498f9356864881356f4c6815d31e1bdeddb7.tar.gz bcm5719-llvm-1f86498f9356864881356f4c6815d31e1bdeddb7.zip |
Do not use host floating point types when emitting
ASCII IR; loading and storing these can change the
bits of NaNs on some hosts. Remove or add warnings
at a few other places using host floating point;
this is a bad thing to do in general.
llvm-svn: 62712
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Support/APFloat.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/Support/FoldingSet.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/VMCore/AsmWriter.cpp | 14 |
3 files changed, 14 insertions, 9 deletions
diff --git a/llvm/lib/Support/APFloat.cpp b/llvm/lib/Support/APFloat.cpp index c296770385f..d8d414d7ea5 100644 --- a/llvm/lib/Support/APFloat.cpp +++ b/llvm/lib/Support/APFloat.cpp @@ -599,7 +599,8 @@ APFloat::copySignificand(const APFloat &rhs) } /* Make this number a NaN, with an arbitrary but deterministic value - for the significand. */ + for the significand. If double or longer, this is a signalling NaN, + which may not be ideal. */ void APFloat::makeNaN(void) { diff --git a/llvm/lib/Support/FoldingSet.cpp b/llvm/lib/Support/FoldingSet.cpp index d2b02f240c9..3a1a0cd842e 100644 --- a/llvm/lib/Support/FoldingSet.cpp +++ b/llvm/lib/Support/FoldingSet.cpp @@ -61,12 +61,6 @@ void FoldingSetNodeID::AddInteger(unsigned long long I) { if ((uint64_t)(int)I != I) Bits.push_back(unsigned(I >> 32)); } -void FoldingSetNodeID::AddFloat(float F) { - Bits.push_back(FloatToBits(F)); -} -void FoldingSetNodeID::AddDouble(double D) { - AddInteger(DoubleToBits(D)); -} void FoldingSetNodeID::AddString(const char *String) { unsigned Size = static_cast<unsigned>(strlen(String)); diff --git a/llvm/lib/VMCore/AsmWriter.cpp b/llvm/lib/VMCore/AsmWriter.cpp index b59ec0863b3..6a17516be26 100644 --- a/llvm/lib/VMCore/AsmWriter.cpp +++ b/llvm/lib/VMCore/AsmWriter.cpp @@ -640,6 +640,7 @@ static void WriteConstantInt(raw_ostream &Out, const Constant *CV, // make sure that we only output it in exponential format if we can parse // the value back and get the same value. // + bool ignored; bool isDouble = &CFP->getValueAPF().getSemantics()==&APFloat::IEEEdouble; double Val = isDouble ? CFP->getValueAPF().convertToDouble() : CFP->getValueAPF().convertToFloat(); @@ -659,11 +660,20 @@ static void WriteConstantInt(raw_ostream &Out, const Constant *CV, } } // Otherwise we could not reparse it to exactly the same value, so we must - // output the string in hexadecimal format! + // output the string in hexadecimal format! Note that loading and storing + // floating point types changes the bits of NaNs on some hosts, notably + // x86, so we must not use these types. assert(sizeof(double) == sizeof(uint64_t) && "assuming that double is 64 bits!"); char Buffer[40]; - Out << "0x" << utohex_buffer(uint64_t(DoubleToBits(Val)), Buffer+40); + APFloat apf = CFP->getValueAPF(); + // Floats are represented in ASCII IR as double, convert. + if (!isDouble) + apf.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, + &ignored); + Out << "0x" << + utohex_buffer(uint64_t(apf.bitcastToAPInt().getZExtValue()), + Buffer+40); return; } |