[llvm-commits] CVS: llvm/lib/CWriter/Writer.cpp

Chris Lattner lattner at cs.uiuc.edu
Sun Oct 12 03:14:02 PDT 2003


Changes in directory llvm/lib/CWriter:

Writer.cpp updated: 1.129 -> 1.130

---
Log message:

* Spell "necessary" correctly
* Print floating point values using C99 hexadecimal style FP if possible.
  This increases the number of floating point constants that may be emitted 
  inline, and improves precision for global variable initializers which 
  can not be emitted in integer form.

This fixes the Olden/Power benchmark with the CBE!!!!




---
Diffs of the changes:  (+24 -3)

Index: llvm/lib/CWriter/Writer.cpp
diff -u llvm/lib/CWriter/Writer.cpp:1.129 llvm/lib/CWriter/Writer.cpp:1.130
--- llvm/lib/CWriter/Writer.cpp:1.129	Sat Oct 11 23:36:29 2003
+++ llvm/lib/CWriter/Writer.cpp	Sun Oct 12 03:12:58 2003
@@ -23,6 +23,10 @@
 #include <algorithm>
 #include <sstream>
 
+
+/* FIXME: This should be autoconf'd! */
+#define HAS_C99_HEXADECIMAL_CONSTANTS 1
+
 namespace {
   class CWriter : public Pass, public InstVisitor<CWriter> {
     std::ostream &Out; 
@@ -337,6 +341,16 @@
 // only deal in IEEE FP).
 //
 static bool isFPCSafeToPrint(const ConstantFP *CFP) {
+#if HAS_C99_HEXADECIMAL_CONSTANTS
+  char Buffer[100];
+  sprintf(Buffer, "%a", CFP->getValue());
+
+  if (!strncmp(Buffer, "0x", 2) ||
+      !strncmp(Buffer, "-0x", 3) ||
+      !strncmp(Buffer, "+0x", 3))
+    return atof(Buffer) == CFP->getValue();
+  return false;
+#else
   std::string StrVal = ftostr(CFP->getValue());
 
   while (StrVal[0] == ' ')
@@ -350,6 +364,7 @@
     // Reparse stringized version!
     return atof(StrVal.c_str()) == CFP->getValue();
   return false;
+#endif
 }
 
 // printConstant - The LLVM Constant to C Constant converter.
@@ -442,8 +457,14 @@
       Out << "(*(" << (FPC->getType() == Type::FloatTy ? "float" : "double")
           << "*)&FPConstant" << I->second << ")";
     } else {
+#if HAS_C99_HEXADECIMAL_CONSTANTS
       // Print out the constant as a floating point number.
+      char Buffer[100];
+      sprintf(Buffer, "%a", FPC->getValue());
+      Out << Buffer << " /*" << FPC->getValue() << "*/ ";
+#else
       Out << ftostr(FPC->getValue());
+#endif
     }
     break;
   }
@@ -1018,7 +1039,7 @@
   emittedInvoke = true;
 }
 
-static bool isGotoCodeNeccessary(BasicBlock *From, BasicBlock *To) {
+static bool isGotoCodeNecessary(BasicBlock *From, BasicBlock *To) {
   // If PHI nodes need copies, we need the copy code...
   if (isa<PHINode>(To->front()) ||
       From->getNext() != To)      // Not directly successor, need goto
@@ -1051,14 +1072,14 @@
 //
 void CWriter::visitBranchInst(BranchInst &I) {
   if (I.isConditional()) {
-    if (isGotoCodeNeccessary(I.getParent(), I.getSuccessor(0))) {
+    if (isGotoCodeNecessary(I.getParent(), I.getSuccessor(0))) {
       Out << "  if (";
       writeOperand(I.getCondition());
       Out << ") {\n";
       
       printBranchToBlock(I.getParent(), I.getSuccessor(0), 2);
       
-      if (isGotoCodeNeccessary(I.getParent(), I.getSuccessor(1))) {
+      if (isGotoCodeNecessary(I.getParent(), I.getSuccessor(1))) {
         Out << "  } else {\n";
         printBranchToBlock(I.getParent(), I.getSuccessor(1), 2);
       }





More information about the llvm-commits mailing list