summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorDale Johannesen <dalej@apple.com>2009-01-21 20:32:55 +0000
committerDale Johannesen <dalej@apple.com>2009-01-21 20:32:55 +0000
commit1f86498f9356864881356f4c6815d31e1bdeddb7 (patch)
treee5504821f989aa3d296dda3d335994580d4d2306 /llvm/lib
parente387d9ed5b6832a877a895a6449b53b2f4e816a0 (diff)
downloadbcm5719-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.cpp3
-rw-r--r--llvm/lib/Support/FoldingSet.cpp6
-rw-r--r--llvm/lib/VMCore/AsmWriter.cpp14
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;
}
OpenPOWER on IntegriCloud