[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

2007-02-24 Thread Jim Laskey


Changes in directory llvm/lib/CodeGen/SelectionDAG:

LegalizeDAG.cpp updated: 1.478 -> 1.479
---
Log message:

Drop unused operand.

---
Diffs of the changes:  (+0 -2)

 LegalizeDAG.cpp |2 --
 1 files changed, 2 deletions(-)


Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.478 
llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.479
--- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.478 Thu Feb 22 09:37:19 2007
+++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp   Sat Feb 24 03:44:17 2007
@@ -677,8 +677,6 @@
   Result = DAG.getConstant(0, TLI.getPointerTy());
 break;
   case ISD::EHSELECTION:
-LegalizeOp(Node->getOperand(1));
-// Fall Thru
   case ISD::EXCEPTIONADDR: {
 Tmp1 = LegalizeOp(Node->getOperand(0));
 MVT::ValueType VT = Node->getValueType(0);



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

2007-02-24 Thread Jim Laskey


Changes in directory llvm/lib/CodeGen/SelectionDAG:

SelectionDAGISel.cpp updated: 1.373 -> 1.374
---
Log message:

Deal with cases when MMI is not requested.

---
Diffs of the changes:  (+14 -0)

 SelectionDAGISel.cpp |   14 ++
 1 files changed, 14 insertions(+)


Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.373 
llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.374
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.373Fri Feb 23 
15:45:01 2007
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp  Sat Feb 24 03:45:44 2007
@@ -2101,6 +2101,12 @@
   SDOperand Op = DAG.getNode(ISD::EXCEPTIONADDR, VTs, Ops, 1);
   setValue(&I, Op);
   DAG.setRoot(Op.getValue(1));
+} else {
+  SDOperand Op = DAG.getNode(ISD::MERGE_VALUES, TLI.getPointerTy(),
+ DAG.getConstant(0, TLI.getPointerTy()),
+ DAG.getRoot());
+  setValue(&I, Op);
+  DAG.setRoot(Op.getValue(1));
 }
 return 0;
   }
@@ -2145,6 +2151,12 @@
   SDOperand Op = DAG.getNode(ISD::EHSELECTION, VTs, Ops, 2);
   setValue(&I, Op);
   DAG.setRoot(Op.getValue(1));
+} else {
+  SDOperand Op = DAG.getNode(ISD::MERGE_VALUES, TLI.getPointerTy(),
+ DAG.getConstant(0, TLI.getPointerTy()),
+ getValue(I.getOperand(1)));
+  setValue(&I, Op);
+  DAG.setRoot(Op.getValue(1));
 }
 
 return 0;
@@ -2169,6 +2181,8 @@
   
   unsigned TypeID = MMI->getTypeIDFor(GV);
   setValue(&I, DAG.getConstant(TypeID, MVT::i32));
+} else {
+  setValue(&I, DAG.getConstant(0, MVT::i32));
 }
 
 return 0;



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/include/llvm/ADT/APInt.h

2007-02-24 Thread Reid Spencer


Changes in directory llvm/include/llvm/ADT:

APInt.h updated: 1.16 -> 1.17
---
Log message:

Improve documentation.
Make divide function internal (it was briefly external for testing).


---
Diffs of the changes:  (+16 -12)

 APInt.h |   28 
 1 files changed, 16 insertions(+), 12 deletions(-)


Index: llvm/include/llvm/ADT/APInt.h
diff -u llvm/include/llvm/ADT/APInt.h:1.16 llvm/include/llvm/ADT/APInt.h:1.17
--- llvm/include/llvm/ADT/APInt.h:1.16  Tue Feb 20 21:56:12 2007
+++ llvm/include/llvm/ADT/APInt.h   Sat Feb 24 03:50:13 2007
@@ -107,8 +107,8 @@
   }
 
   /// This method is used internally to clear the to "N" bits that are not used
-  /// by the APInt. This is needed after a word is assigned a value to ensure 
-  /// that those bits are zero'd out.
+  /// by the APInt. This is needed after the most significant word is assigned 
+  /// a value to ensure that those bits are zero'd out.
   /// @brief Clear high order bits
   inline void clearUnusedBits() {
 if (isSingleWord())
@@ -119,31 +119,35 @@
   }
 
   /// @returns the corresponding word for the specified bit position.
-  /// This is a constant version.
+  /// @brief Get the word corresponding to a bit position
   inline uint64_t getWord(uint32_t bitPosition) const { 
 return isSingleWord() ? VAL : pVal[whichWord(bitPosition)]; 
   }
 
-  /// @brief Converts a char array into an integer.
+  /// This is used by the constructors that take string arguments.
+  /// @brief Converts a char array into an APInt
   void fromString(uint32_t numBits, const char *StrStart, uint32_t slen, 
   uint8_t radix);
 
+  /// This is used by the toString method to divide by the radix. It simply
+  /// provides a more convenient form of divide for internal use.
+  /// @brief An internal division function for dividing APInts.
+  static void divide(const APInt LHS, uint32_t lhsWords, 
+ const APInt &RHS, uint32_t rhsWords,
+ APInt *Quotient, APInt *Remainder);
+
 #ifndef NDEBUG
   /// @brief debug method
   void dump() const;
 #endif
 
 public:
-  /// @brief An internal division function for dividing APInts.
-  static void divide(const APInt LHS, uint32_t lhsWords, 
- const APInt &RHS, uint32_t rhsWords,
- APInt *Quotient, APInt *Remainder);
-
-  /// @brief Create a new APInt of numBits bit-width, and initialized as val.
+  /// @brief Create a new APInt of numBits width, initialized as val.
   APInt(uint32_t numBits, uint64_t val);
 
-  /// @brief Create a new APInt of numBits bit-width, and initialized as 
-  /// bigVal[].
+  /// Note that numWords can be smaller or larger than the corresponding bit
+  /// width but any extraneous bits will be dropped.
+  /// @brief Create a new APInt of numBits width, initialized as bigVal[].
   APInt(uint32_t numBits, uint32_t numWords, uint64_t bigVal[]);
 
   /// @brief Create a new APInt by translating the string represented 



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp

2007-02-24 Thread Reid Spencer


Changes in directory llvm-test/SingleSource/UnitTests/Integer/APInt:

gptest.cpp updated: 1.3 -> 1.4
---
Log message:

Add logical operators, shift, and index tests.


---
Diffs of the changes:  (+133 -8)

 gptest.cpp |  141 +
 1 files changed, 133 insertions(+), 8 deletions(-)


Index: llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp
diff -u llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp:1.3 
llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp:1.4
--- llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp:1.3   Wed Feb 
21 19:03:12 2007
+++ llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp   Sat Feb 24 
03:51:47 2007
@@ -40,6 +40,10 @@
 }
 
 std::string getResult(const std::string& cmd) {
+#if 0
+  printf("Command: %s", cmd.c_str());
+  fflush(stdout);
+#endif
   const char *command = cmd.c_str();
   if (-1 == write(output, command, cmd.size())) {
 std::string msg = "write: " + cmd;
@@ -47,7 +51,6 @@
 perror(msg.c_str());
 exit(1);
   }
-   usleep(1); // try to switch contexts
   char buf[4096];
   int len = read(input, buf, 4095);
   if (-1 == len) {
@@ -76,13 +79,9 @@
 }
 
 
-bool getCompare(const APInt &v1, const std::string &op, 
-const APInt &v2, bool wantSigned = false) {
-
-  std::string cmd = v1.toString(10, wantSigned) + op + 
-v2.toString(10, wantSigned) + '\n';
-  std::string result = getResult(cmd);
-  return bool(atoi(result.c_str()));
+void report(const std::string& cmd,
+const std::string& result, const std::string& apresult) {
+  printf("%s = %s (not %s)\n", cmd.c_str(), result.c_str(), apresult.c_str());
 }
 
 void report(const APInt &v1, const APInt &v2, const std::string& op, 
@@ -94,6 +93,14 @@
   fflush(stdout);
 }
 
+void report(const APInt &v1, const std::string &op, 
+const std::string& result, const std::string& apresult) {
+  printf(op.c_str());
+  print(v1, false, false);
+  printf(" = %s (not %s)\n", result.c_str(), apresult.c_str());
+  fflush(stdout);
+}
+
 void doMultiply(const APInt &v1, const APInt &v2) {
   std::string result = getBinop(v1, "*", v2);
   APInt r = v1 * v2;
@@ -138,6 +145,117 @@
 report(v1,v2," - ", result,apresult);
 }
 
+void doAnd(const APInt &v1, const APInt &v2) {
+  std::string cmd;
+  cmd += "bitand(";
+  cmd += v1.toString(10,false);
+  cmd += ",";
+  cmd += v2.toString(10,false);
+  cmd += ")\n";
+  std::string result = getResult(cmd);
+  APInt r = v1 & v2;
+  std::string apresult = r.toString(10, false);
+  if (result != apresult)
+report(cmd, result,apresult);
+}
+
+void doOr(const APInt &v1, const APInt &v2) {
+  std::string cmd;
+  cmd += "bitor(";
+  cmd += v1.toString(10,false);
+  cmd += ",";
+  cmd += v2.toString(10,false);
+  cmd += ")\n";
+  std::string result = getResult(cmd);
+  APInt r = v1 | v2;
+  std::string apresult = r.toString(10, false);
+  if (result != apresult)
+report(cmd, result,apresult);
+}
+
+void doXor(const APInt &v1, const APInt &v2) {
+  std::string cmd;
+  cmd += "bitxor(";
+  cmd += v1.toString(10,false);
+  cmd += ",";
+  cmd += v2.toString(10,false);
+  cmd += ")\n";
+  std::string result = getResult(cmd);
+  APInt r = v1 ^ v2;
+  std::string apresult = r.toString(10, false);
+  if (result != apresult)
+report(cmd, result,apresult);
+}
+
+void doComplement(const APInt &v1) {
+  std::string cmd;
+  cmd += "bitneg(";
+  cmd += v1.toString(10,false);
+  cmd += "," + utostr(v1.getBitWidth()) + ")\n";
+  std::string result = getResult(cmd);
+  APInt r = ~v1;
+  std::string apresult = r.toString(10, false);
+  if (result != apresult)
+report(v1," ~ ", result,apresult);
+}
+
+void doBitTest(const APInt &v1) {
+  for (int i = 0; i < v1.getBitWidth(); i++) {
+std::string cmd;
+cmd += "bittest(";
+cmd += v1.toString(10,false);
+cmd += "," + utostr(i) + ")\n";
+bool gpresult = atoi(getResult(cmd).c_str());
+bool apresult = v1[i];
+if (gpresult != apresult) {
+  print(v1, false, false);
+  printf("[%d] = %s (not %s)\n", i,
+(gpresult?"true":"false"), (apresult?"true":"false"));
+  fflush(stdout);
+}
+  }
+}
+
+void doShift(const APInt &v1) {
+  APInt mask = APInt::getAllOnesValue(v1.getBitWidth());
+  for (int i = 1; i <= v1.getBitWidth(); i++) {
+std::string cmd;
+cmd += "bitand(truncate(shift(";
+cmd += v1.toString(10,false);
+cmd += "," + utostr(unsigned(i)) + ")), ";
+cmd += "bitneg(0," + utostr(unsigned(v1.getBitWidth())) + "))\n";
+std::string gpresult = getResult(cmd);
+APInt R1 = v1.shl(i);
+std::string apresult = R1.toString(10,false);
+if (gpresult != apresult) {
+  print(v1, false, false);
+  printf(" << %d = %s (not %s)\n", i, gpresult.c_str(), apresult.c_str());
+  fflush(stdout);
+}
+cmd = "bitand(truncate(shift(";
+cmd += v1.toString(10,false);
+cmd += ",-" + utostr(i) + ")), ";
+cmd += "bitneg(0," + 

[llvm-commits] CVS: llvm/lib/Support/APInt.cpp

2007-02-24 Thread Reid Spencer


Changes in directory llvm/lib/Support:

APInt.cpp updated: 1.33 -> 1.34
---
Log message:

1. Fix last bug in KnuthDiv. All divide tests pass up to 1024 bits now.
2. Clean up comments, style, coding standards, etc.
3. Simplify a constructor.

Extended testing revealed some additional bugs in shifting. I'll fix these
tomorrow.


---
Diffs of the changes:  (+54 -62)

 APInt.cpp |  116 --
 1 files changed, 54 insertions(+), 62 deletions(-)


Index: llvm/lib/Support/APInt.cpp
diff -u llvm/lib/Support/APInt.cpp:1.33 llvm/lib/Support/APInt.cpp:1.34
--- llvm/lib/Support/APInt.cpp:1.33 Fri Feb 23 21:58:46 2007
+++ llvm/lib/Support/APInt.cpp  Sat Feb 24 04:01:42 2007
@@ -2,8 +2,9 @@
 //
 // The LLVM Compiler Infrastructure
 //
-// This file was developed by Sheng Zhou and is distributed under the
-// University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file was developed by Sheng Zhou and Reid Spencer and is distributed 
+// under the // University of Illinois Open Source License. See LICENSE.TXT 
+// for details.
 //
 
//===--===//
 //
@@ -20,14 +21,13 @@
 #include 
 #include 
 #ifndef NDEBUG
-#include 
 #include 
 #endif
 
 using namespace llvm;
 
 // A utility function for allocating memory, checking for allocation failures,
-// and ensuring the contents is zeroed.
+// and ensuring the contents are zeroed.
 inline static uint64_t* getClearedMemory(uint32_t numWords) {
   uint64_t * result = new uint64_t[numWords];
   assert(result && "APInt memory allocation fails!");
@@ -36,6 +36,7 @@
 }
 
 // A utility function for allocating memory and checking for allocation 
failure.
+// The content is not zero'd
 inline static uint64_t* getMemory(uint32_t numWords) {
   uint64_t * result = new uint64_t[numWords];
   assert(result && "APInt memory allocation fails!");
@@ -60,38 +61,31 @@
   assert(BitWidth <= IntegerType::MAX_INT_BITS && "bitwidth too large");
   assert(bigVal && "Null pointer detected!");
   if (isSingleWord())
-VAL = bigVal[0] & (~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - BitWidth));
+VAL = bigVal[0];
   else {
-pVal = getMemory(getNumWords());
-// Calculate the actual length of bigVal[].
-uint32_t maxN = std::max(numWords, getNumWords());
-uint32_t minN = std::min(numWords, getNumWords());
-memcpy(pVal, bigVal, (minN - 1) * APINT_WORD_SIZE);
-pVal[minN-1] = bigVal[minN-1] & 
-(~uint64_t(0ULL) >> 
- (APINT_BITS_PER_WORD - BitWidth % APINT_BITS_PER_WORD));
-if (maxN == getNumWords())
-  memset(pVal+numWords, 0, (getNumWords() - numWords) * APINT_WORD_SIZE);
+// Get memory, cleared to 0
+pVal = getClearedMemory(getNumWords());
+// Calculate the number of words to copy
+uint32_t words = std::min(numWords, getNumWords());
+// Copy the words from bigVal to pVal
+memcpy(pVal, bigVal, words * APINT_WORD_SIZE);
   }
+  // Make sure unused high bits are cleared
+  clearUnusedBits();
 }
 
-/// @brief Create a new APInt by translating the char array represented
-/// integer value.
 APInt::APInt(uint32_t numbits, const char StrStart[], uint32_t slen, 
  uint8_t radix) 
   : BitWidth(numbits), VAL(0) {
   fromString(numbits, StrStart, slen, radix);
 }
 
-/// @brief Create a new APInt by translating the string represented
-/// integer value.
 APInt::APInt(uint32_t numbits, const std::string& Val, uint8_t radix)
   : BitWidth(numbits), VAL(0) {
   assert(!Val.empty() && "String empty?");
   fromString(numbits, Val.c_str(), Val.size(), radix);
 }
 
-/// @brief Copy constructor
 APInt::APInt(const APInt& that)
   : BitWidth(that.BitWidth), VAL(0) {
   if (isSingleWord()) 
@@ -107,8 +101,6 @@
 delete[] pVal;
 }
 
-/// @brief Copy assignment operator. Create a new object from the given
-/// APInt one by initialization.
 APInt& APInt::operator=(const APInt& RHS) {
   assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
   if (isSingleWord()) 
@@ -118,8 +110,6 @@
   return *this;
 }
 
-/// @brief Assignment operator. Assigns a common case integer value to 
-/// the APInt.
 APInt& APInt::operator=(uint64_t RHS) {
   if (isSingleWord()) 
 VAL = RHS;
@@ -134,15 +124,13 @@
 /// "digit" integer array,  x[]. x[] is modified to reflect the addition and
 /// 1 is returned if there is a carry out, otherwise 0 is returned.
 /// @returns the carry of the addition.
-static uint64_t add_1(uint64_t dest[], 
- uint64_t x[], uint32_t len, 
- uint64_t y) {
+static uint64_t add_1(uint64_t dest[], uint64_t x[], uint32_t len, uint64_t y) 
{
   for (uint32_t i = 0; i < len; ++i) {
 dest[i] = y + x[i];
 if (dest[i] < y)
-  y = 1;
+  y = 1; // Carry one to next digit.
 else {
-  y = 0;
+  y = 0; // No need to carry so exit early
   break;
 }
   

[llvm-commits] CVS: llvm/lib/Support/APInt.cpp

2007-02-24 Thread Reid Spencer


Changes in directory llvm/lib/Support:

APInt.cpp updated: 1.34 -> 1.35
---
Log message:

1. Fix a bug in fromString for the <= 64bits case
2. Fix shl when shiftAmount == BitWidth.


---
Diffs of the changes:  (+30 -18)

 APInt.cpp |   48 ++--
 1 files changed, 30 insertions(+), 18 deletions(-)


Index: llvm/lib/Support/APInt.cpp
diff -u llvm/lib/Support/APInt.cpp:1.34 llvm/lib/Support/APInt.cpp:1.35
--- llvm/lib/Support/APInt.cpp:1.34 Sat Feb 24 04:01:42 2007
+++ llvm/lib/Support/APInt.cpp  Sat Feb 24 14:19:37 2007
@@ -945,24 +945,33 @@
 /// Left-shift this APInt by shiftAmt.
 /// @brief Left-shift function.
 APInt APInt::shl(uint32_t shiftAmt) const {
+  assert(shiftAmt <= BitWidth && "Invalid shift amount");
   APInt API(*this);
-  if (API.isSingleWord())
-API.VAL <<= shiftAmt;
-  else if (shiftAmt >= API.BitWidth)
-memset(API.pVal, 0, API.getNumWords() * APINT_WORD_SIZE);
-  else {
-if (uint32_t offset = shiftAmt / APINT_BITS_PER_WORD) {
-  for (uint32_t i = API.getNumWords() - 1; i > offset - 1; --i)
-API.pVal[i] = API.pVal[i-offset];
-  memset(API.pVal, 0, offset * APINT_WORD_SIZE);
-}
-shiftAmt %= APINT_BITS_PER_WORD;
-uint32_t i;
-for (i = API.getNumWords() - 1; i > 0; --i)
-  API.pVal[i] = (API.pVal[i] << shiftAmt) | 
-(API.pVal[i-1] >> (APINT_BITS_PER_WORD - shiftAmt));
-API.pVal[i] <<= shiftAmt;
-  }
+  if (API.isSingleWord()) {
+if (shiftAmt == BitWidth)
+  API.VAL = 0;
+else 
+  API.VAL <<= shiftAmt;
+API.clearUnusedBits();
+return API;
+  }
+
+  if (shiftAmt == BitWidth) {
+memset(API.pVal, 0, getNumWords() * APINT_WORD_SIZE);
+return API;
+  }
+
+  if (uint32_t offset = shiftAmt / APINT_BITS_PER_WORD) {
+for (uint32_t i = API.getNumWords() - 1; i > offset - 1; --i)
+  API.pVal[i] = API.pVal[i-offset];
+memset(API.pVal, 0, offset * APINT_WORD_SIZE);
+  }
+  shiftAmt %= APINT_BITS_PER_WORD;
+  uint32_t i;
+  for (i = API.getNumWords() - 1; i > 0; --i)
+API.pVal[i] = (API.pVal[i] << shiftAmt) | 
+  (API.pVal[i-1] >> (APINT_BITS_PER_WORD - shiftAmt));
+  API.pVal[i] <<= shiftAmt;
   API.clearUnusedBits();
   return API;
 }
@@ -1423,7 +1432,10 @@
   *this *= apradix;
 
 // Add in the digit we just interpreted
-apdigit.pVal[0] = digit;
+if (apdigit.isSingleWord())
+  apdigit.VAL = digit;
+else
+  apdigit.pVal[0] = digit;
 *this += apdigit;
   }
 }



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp

2007-02-24 Thread Reid Spencer


Changes in directory llvm-test/SingleSource/UnitTests/Integer/APInt:

gptest.cpp updated: 1.4 -> 1.5
---
Log message:

Consolidate reporting.
Consolidate comparison tests.
Fix output for remainder.


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

 gptest.cpp |   80 ++---
 1 files changed, 24 insertions(+), 56 deletions(-)


Index: llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp
diff -u llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp:1.4 
llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp:1.5
--- llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp:1.4   Sat Feb 
24 03:51:47 2007
+++ llvm-test/SingleSource/UnitTests/Integer/APInt/gptest.cpp   Sat Feb 24 
14:20:46 2007
@@ -78,12 +78,6 @@
   return getResult(cmd);
 }
 
-
-void report(const std::string& cmd,
-const std::string& result, const std::string& apresult) {
-  printf("%s = %s (not %s)\n", cmd.c_str(), result.c_str(), apresult.c_str());
-}
-
 void report(const APInt &v1, const APInt &v2, const std::string& op, 
 const std::string& result, const std::string& apresult) {
   print(v1, false, false);
@@ -93,14 +87,6 @@
   fflush(stdout);
 }
 
-void report(const APInt &v1, const std::string &op, 
-const std::string& result, const std::string& apresult) {
-  printf(op.c_str());
-  print(v1, false, false);
-  printf(" = %s (not %s)\n", result.c_str(), apresult.c_str());
-  fflush(stdout);
-}
-
 void doMultiply(const APInt &v1, const APInt &v2) {
   std::string result = getBinop(v1, "*", v2);
   APInt r = v1 * v2;
@@ -126,7 +112,7 @@
   APInt r = APIntOps::urem(v1, v2);
   std::string apresult = r.toString(10, false);
   if (result != apresult)
-report(v1,v2," % ", result,apresult);
+report(v1,v2," %% ", result,apresult);
 }
 
 void doAdd(const APInt &v1, const APInt &v2) {
@@ -156,7 +142,7 @@
   APInt r = v1 & v2;
   std::string apresult = r.toString(10, false);
   if (result != apresult)
-report(cmd, result,apresult);
+report(v1, v2, " and ", result,apresult);
 }
 
 void doOr(const APInt &v1, const APInt &v2) {
@@ -170,7 +156,7 @@
   APInt r = v1 | v2;
   std::string apresult = r.toString(10, false);
   if (result != apresult)
-report(cmd, result,apresult);
+report(v1, v2, " or ", result,apresult);
 }
 
 void doXor(const APInt &v1, const APInt &v2) {
@@ -184,7 +170,7 @@
   APInt r = v1 ^ v2;
   std::string apresult = r.toString(10, false);
   if (result != apresult)
-report(cmd, result,apresult);
+report(v1, v2, " xor ", result,apresult);
 }
 
 void doComplement(const APInt &v1) {
@@ -195,8 +181,12 @@
   std::string result = getResult(cmd);
   APInt r = ~v1;
   std::string apresult = r.toString(10, false);
-  if (result != apresult)
-report(v1," ~ ", result,apresult);
+  if (result != apresult) {
+printf("~ ");
+print(v1, false, false);
+printf(" = %s (not %s)\n", result.c_str(), apresult.c_str());
+fflush(stdout);
+  }
 }
 
 void doBitTest(const APInt &v1) {
@@ -241,46 +231,19 @@
 apresult = R1.toString(10,false);
 if (gpresult != apresult) {
   print(v1, false, false);
-  printf(" s>> %d = %s (not %s)\n", i, gpresult.c_str(), apresult.c_str());
+  printf(" u>> %d = %s (not %s)\n", i, gpresult.c_str(), apresult.c_str());
   fflush(stdout);
 }
   }
 }
 
-bool getCompare(const APInt &v1, const std::string &op, 
-const APInt &v2, bool wantSigned = false) {
-
-  std::string cmd = v1.toString(10, wantSigned) + op + 
-v2.toString(10, wantSigned) + '\n';
-  std::string result = getResult(cmd);
-  return bool(atoi(result.c_str()));
-}
-
-void doComparisons(const APInt &v1, const APInt &v2) {
-  bool result = getCompare(v1, "==", v2);
-  bool apresult = v1 == v2;
-  if (result != apresult)
-report(v1,v2," == ", (result?"true":"false"), (apresult?"true":"false"));
-  result = getCompare(v1, "!=", v2);
-  apresult = v1 != v2;
-  if (result != apresult)
-report(v1,v2," != ", (result?"true":"false"), (apresult?"true":"false"));
-  result = getCompare(v1, "<", v2);
-  apresult = v1.ult(v2);
-  if (result != apresult)
-report(v1,v2," < ", (result?"true":"false"), (apresult?"true":"false"));
-  result = getCompare(v1, "<=", v2);
-  apresult = v1.ule(v2);
-  if (result != apresult)
-report(v1,v2," <= ", (result?"true":"false"), (apresult?"true":"false"));
-  result = getCompare(v1, ">", v2);
-  apresult = v1.ugt(v2);
-  if (result != apresult)
-report(v1,v2," > ", (result?"true":"false"), (apresult?"true":"false"));
-  result = getCompare(v1, ">=", v2);
-  apresult = v1.uge(v2);
-  if (result != apresult)
-report(v1,v2," >= ", (result?"true":"false"), (apresult?"true":"false"));
+void doCompare(const APInt &v1, const std::string &op, 
+const APInt &v2, bool apresult) {
+  std::string cmd = v1.toString(10, false) + op + 
+v2.toString(10, false) + '\n';
+  bool gpresult = atoi(getResu

[llvm-commits] CVS: llvm/lib/Support/APInt.cpp

2007-02-24 Thread Reid Spencer


Changes in directory llvm/lib/Support:

APInt.cpp updated: 1.35 -> 1.36
---
Log message:

Fix the remainder shifting in KnuthDiv. 


---
Diffs of the changes:  (+13 -6)

 APInt.cpp |   19 +--
 1 files changed, 13 insertions(+), 6 deletions(-)


Index: llvm/lib/Support/APInt.cpp
diff -u llvm/lib/Support/APInt.cpp:1.35 llvm/lib/Support/APInt.cpp:1.36
--- llvm/lib/Support/APInt.cpp:1.35 Sat Feb 24 14:19:37 2007
+++ llvm/lib/Support/APInt.cpp  Sat Feb 24 14:38:01 2007
@@ -1134,12 +1134,19 @@
 // The value d is expressed by the "shift" value above since we avoided
 // multiplication by d by using a shift left. So, all we have to do is
 // shift right here. In order to mak
-uint32_t carry = 0;
-DEBUG(cerr << "KnuthDiv: remainder:");
-for (int i = n-1; i >= 0; i--) {
-  r[i] = (u[i] >> shift) | carry;
-  carry = u[i] << shift;
-  DEBUG(cerr << " " << r[i]);
+if (shift) {
+  uint32_t carry = 0;
+  DEBUG(cerr << "KnuthDiv: remainder:");
+  for (int i = n-1; i >= 0; i--) {
+r[i] = (u[i] >> shift) | carry;
+carry = u[i] << (32 - shift);
+DEBUG(cerr << " " << r[i]);
+  }
+} else {
+  for (int i = n-1; i >= 0; i--) {
+r[i] = u[i];
+DEBUG(cerr << " " << r[i]);
+  }
 }
 DEBUG(cerr << '\n');
   }



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/ARM/ARMConstantIslandPass.cpp README.txt

2007-02-24 Thread Dale Johannesen


Changes in directory llvm/lib/Target/ARM:

ARMConstantIslandPass.cpp updated: 1.27 -> 1.28
README.txt updated: 1.12 -> 1.13
---
Log message:

Removed WaterListOffset, inserted BBOffsets.  Remove TODO item about this
from README.  
When no water available, use end of block if in range.  (More to do here.)


---
Diffs of the changes:  (+114 -109)

 ARMConstantIslandPass.cpp |  207 +++---
 README.txt|   16 ++-
 2 files changed, 114 insertions(+), 109 deletions(-)


Index: llvm/lib/Target/ARM/ARMConstantIslandPass.cpp
diff -u llvm/lib/Target/ARM/ARMConstantIslandPass.cpp:1.27 
llvm/lib/Target/ARM/ARMConstantIslandPass.cpp:1.28
--- llvm/lib/Target/ARM/ARMConstantIslandPass.cpp:1.27  Thu Feb 22 23:02:36 2007
+++ llvm/lib/Target/ARM/ARMConstantIslandPass.cpp   Sat Feb 24 18:47:03 2007
@@ -4,6 +4,7 @@
 //
 // This file was developed by Chris Lattner and is distributed under the
 // University of Illinois Open Source License. See LICENSE.TXT for details.
+// Substantial modifications by Evan Cheng and Dale Johannesen.
 //
 
//===--===//
 //
@@ -49,21 +50,19 @@
   class VISIBILITY_HIDDEN ARMConstantIslands : public MachineFunctionPass {
 /// NextUID - Assign unique ID's to CPE's.
 unsigned NextUID;
-
+
 /// BBSizes - The size of each MachineBasicBlock in bytes of code, indexed
 /// by MBB Number.
 std::vector BBSizes;
 
+/// BBOffsets - the offset of each MBB in bytes, starting from 0.
+std::vector BBOffsets;
+
 /// WaterList - A sorted list of basic blocks where islands could be placed
 /// (i.e. blocks that don't fall through to the following block, due
 /// to a return, unreachable, or unconditional branch).
 std::vector WaterList;
 
-// WaterListOffsets - the offset of the beginning of each WaterList block.
-// This is computed as needed in HandleConstantPoolUser; not necessarily
-// valid at arbitrary times.
-std::vector WaterListOffsets;
-
 /// CPUser - One user of a constant pool, keeping the machine instruction
 /// pointer, the constant pool being referenced, and the max displacement
 /// allowed from the instruction to the CP.
@@ -139,16 +138,17 @@
  const std::vector &CPEMIs);
 MachineBasicBlock *SplitBlockBeforeInstr(MachineInstr *MI);
 void UpdateForInsertedWaterBlock(MachineBasicBlock *NewBB);
+void AdjustBBOffsetsAfter(MachineBasicBlock *BB, int delta);
 bool DecrementOldEntry(unsigned CPI, MachineInstr* CPEMI, unsigned Size);
-void ComputeWaterListOffsets(MachineFunction &Fn);
 int LookForExistingCPEntry(CPUser& U, unsigned UserOffset);
 bool HandleConstantPoolUser(MachineFunction &Fn, CPUser &U);
 bool CPEIsInRange(MachineInstr *MI, unsigned UserOffset, 
   MachineInstr *CPEMI, unsigned Disp,
   bool DoDump);
-bool WaterIsInRange(unsigned UserOffset, 
-std::vector::iterator IP,
+bool WaterIsInRange(unsigned UserOffset, MachineBasicBlock *Water,
 unsigned Disp);
+bool OffsetIsInRange(unsigned UserOffset, unsigned TrialOffset,
+unsigned Disp, bool NegativeOK);
 bool BBIsInRange(MachineInstr *MI, MachineBasicBlock *BB, unsigned Disp);
 bool FixUpImmediateBr(MachineFunction &Fn, ImmBranch &Br);
 bool FixUpConditionalBr(MachineFunction &Fn, ImmBranch &Br);
@@ -156,7 +156,6 @@
 bool UndoLRSpillRestore();
 
 unsigned GetOffsetOf(MachineInstr *MI) const;
-unsigned GetOffsetOf(MachineBasicBlock *MBB) const;
   };
 }
 
@@ -213,6 +212,7 @@
 MadeChange |= UndoLRSpillRestore();
 
   BBSizes.clear();
+  BBOffsets.clear();
   WaterList.clear();
   CPUsers.clear();
   CPEntries.clear();
@@ -293,6 +293,7 @@
 /// and finding all of the constant pool users.
 void ARMConstantIslands::InitialFunctionScan(MachineFunction &Fn,
  const std::vector &CPEMIs) {
+  unsigned Offset = 0;
   for (MachineFunction::iterator MBBI = Fn.begin(), E = Fn.end();
MBBI != E; ++MBBI) {
 MachineBasicBlock &MBB = *MBBI;
@@ -419,6 +420,8 @@
   MBBSize += 2;
 
 BBSizes.push_back(MBBSize);
+BBOffsets.push_back(Offset);
+Offset += MBBSize;
   }
 }
 
@@ -431,11 +434,7 @@
   // The offset is composed of two things: the sum of the sizes of all MBB's
   // before this instruction's block, and the offset from the start of the 
block
   // it is in.
-  unsigned Offset = 0;
-  
-  // Sum block sizes before MBB.
-  for (unsigned BB = 0, e = MBB->getNumber(); BB != e; ++BB)
-Offset += BBSizes[BB];
+  unsigned Offset = BBOffsets[MBB->getNumber()];
 
   // Sum instructions before MI in MBB.
   for (MachineBasicBlock::iterator I = MBB->begin(); ; ++I) {
@@ -445,18 +444,6 @@
   }
 }
 
-/// GetOffsetOf - Return the current offset of the specified machine BB
-/// from the start of the

[llvm-commits] CVS: llvm/lib/Support/APInt.cpp

2007-02-24 Thread Reid Spencer


Changes in directory llvm/lib/Support:

APInt.cpp updated: 1.36 -> 1.37
---
Log message:

Fix the > 64 bits case for left shift.


---
Diffs of the changes:  (+52 -27)

 APInt.cpp |   79 --
 1 files changed, 52 insertions(+), 27 deletions(-)


Index: llvm/lib/Support/APInt.cpp
diff -u llvm/lib/Support/APInt.cpp:1.36 llvm/lib/Support/APInt.cpp:1.37
--- llvm/lib/Support/APInt.cpp:1.36 Sat Feb 24 14:38:01 2007
+++ llvm/lib/Support/APInt.cpp  Sat Feb 24 18:56:44 2007
@@ -946,34 +946,59 @@
 /// @brief Left-shift function.
 APInt APInt::shl(uint32_t shiftAmt) const {
   assert(shiftAmt <= BitWidth && "Invalid shift amount");
-  APInt API(*this);
-  if (API.isSingleWord()) {
+  if (isSingleWord()) {
 if (shiftAmt == BitWidth)
-  API.VAL = 0;
-else 
-  API.VAL <<= shiftAmt;
-API.clearUnusedBits();
-return API;
-  }
-
-  if (shiftAmt == BitWidth) {
-memset(API.pVal, 0, getNumWords() * APINT_WORD_SIZE);
-return API;
-  }
-
-  if (uint32_t offset = shiftAmt / APINT_BITS_PER_WORD) {
-for (uint32_t i = API.getNumWords() - 1; i > offset - 1; --i)
-  API.pVal[i] = API.pVal[i-offset];
-memset(API.pVal, 0, offset * APINT_WORD_SIZE);
-  }
-  shiftAmt %= APINT_BITS_PER_WORD;
-  uint32_t i;
-  for (i = API.getNumWords() - 1; i > 0; --i)
-API.pVal[i] = (API.pVal[i] << shiftAmt) | 
-  (API.pVal[i-1] >> (APINT_BITS_PER_WORD - shiftAmt));
-  API.pVal[i] <<= shiftAmt;
-  API.clearUnusedBits();
-  return API;
+  return APInt(BitWidth, 0); // avoid undefined shift results
+return APInt(BitWidth, (VAL << shiftAmt) &  
+   (~uint64_t(0ULL) >> 
+(APINT_BITS_PER_WORD - BitWidth)));
+  }
+
+  // If all the bits were shifted out, the result is 0. This avoids issues
+  // with shifting by the size of the integer type, which produces undefined
+  // results. We define these "undefined results" to always be 0.
+  if (shiftAmt == BitWidth)
+return APInt(BitWidth, 0);
+
+  // Create some space for the result.
+  uint64_t * val = new uint64_t[getNumWords()];
+
+  // If we are shifting less than a word, do it the easy way
+  if (shiftAmt < APINT_BITS_PER_WORD) {
+uint64_t carry = 0;
+shiftAmt %= APINT_BITS_PER_WORD;
+for (uint32_t i = 0; i < getNumWords(); i++) {
+  val[i] = pVal[i] << shiftAmt | carry;
+  carry = pVal[i] >> (APINT_BITS_PER_WORD - shiftAmt);
+}
+val[getNumWords()-1] &= ~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - 
BitWidth);
+return APInt(val, BitWidth);
+  }
+
+  // Compute some values needed by the remaining shift algorithms
+  uint32_t wordShift = shiftAmt % APINT_BITS_PER_WORD;
+  uint32_t offset = shiftAmt / APINT_BITS_PER_WORD;
+
+  // If we are shifting whole words, just move whole words
+  if (wordShift == 0) {
+for (uint32_t i = 0; i < offset; i++) 
+  val[i] = 0;
+for (uint32_t i = offset; i < getNumWords(); i++)
+  val[i] = pVal[i-offset];
+val[getNumWords()-1] &= ~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - 
BitWidth);
+return APInt(val,BitWidth);
+  }
+
+  // Copy whole words from this to Result.
+  uint32_t i = getNumWords() - 1;
+  for (; i > offset; --i)
+val[i] = pVal[i-offset] << wordShift |
+ pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
+  val[offset] = pVal[offset-1] << wordShift;
+  for (i = 0; i < offset; ++i)
+val[i] = 0;
+  val[getNumWords()-1] &= ~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - BitWidth);
+  return APInt(val, BitWidth);
 }
 
 /// Implementation of Knuth's Algorithm D (Division of nonnegative integers)



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Support/APInt.cpp

2007-02-24 Thread Reid Spencer


Changes in directory llvm/lib/Support:

APInt.cpp updated: 1.37 -> 1.38
---
Log message:

Whoops, last word with bits in large shift left wasn't correct.


---
Diffs of the changes:  (+1 -1)

 APInt.cpp |2 +-
 1 files changed, 1 insertion(+), 1 deletion(-)


Index: llvm/lib/Support/APInt.cpp
diff -u llvm/lib/Support/APInt.cpp:1.37 llvm/lib/Support/APInt.cpp:1.38
--- llvm/lib/Support/APInt.cpp:1.37 Sat Feb 24 18:56:44 2007
+++ llvm/lib/Support/APInt.cpp  Sat Feb 24 19:08:58 2007
@@ -994,7 +994,7 @@
   for (; i > offset; --i)
 val[i] = pVal[i-offset] << wordShift |
  pVal[i-offset-1] >> (APINT_BITS_PER_WORD - wordShift);
-  val[offset] = pVal[offset-1] << wordShift;
+  val[offset] = pVal[0] << wordShift;
   for (i = 0; i < offset; ++i)
 val[i] = 0;
   val[getNumWords()-1] &= ~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - BitWidth);



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/docs/HowToSubmitABug.html

2007-02-24 Thread Chris Lattner


Changes in directory llvm/docs:

HowToSubmitABug.html updated: 1.28 -> 1.29
---
Log message:

update this for llvm-gcc4


---
Diffs of the changes:  (+78 -94)

 HowToSubmitABug.html |  172 +++
 1 files changed, 78 insertions(+), 94 deletions(-)


Index: llvm/docs/HowToSubmitABug.html
diff -u llvm/docs/HowToSubmitABug.html:1.28 llvm/docs/HowToSubmitABug.html:1.29
--- llvm/docs/HowToSubmitABug.html:1.28 Fri Feb 23 21:46:42 2007
+++ llvm/docs/HowToSubmitABug.html  Sat Feb 24 19:11:36 2007
@@ -19,9 +19,8 @@
   Crashing Bugs
 
 Front-end bugs
-GCCAS bugs
-GCCLD bugs
-Bugs in LLVM passes
+Compile-time optimization bugs
+Code generator bugs
 
   Miscompilations
   Incorrect code generation (JIT and LLC)
@@ -51,15 +50,18 @@
 
 Basically you have to do two things at a minimum.  First, decide whether the
 bug crashes the compiler (or an LLVM pass), or if the
-compiler is miscompiling the program.  Based on
+compiler is miscompiling the program (i.e., the
+compiler successfully produces an executable, but it doesn't run right).  Based
+on
 what type of bug it is, follow the instructions in the linked section to narrow
 down the bug so that the person who fixes it will be able to find the problem
 more easily.
 
 Once you have a reduced test-case, go to http://llvm.org/bugs/enter_bug.cgi";>the LLVM Bug Tracking
-System, select the category in which the bug falls, and fill out the form
-with the necessary details.  The bug description should contain the following
+System and fill out the form with the necessary details (note that you 
don't
+need to pick a catagory, just use the "new-bugs" catagory if you're not sure).
+The bug description should contain the following
 information:
 
 
@@ -81,35 +83,29 @@
 
 
 
-More often than not, bugs in the compiler cause it to crash—often due 
to an
-assertion failure of some sort.  If you are running opt 
-directly, and something crashes, jump to the section on
-bugs in LLVM passes.  Otherwise, the most important
-piece of the puzzle is to figure out if it is the GCC-based front-end that is
-buggy or if it's one of the LLVM tools that has problems.
+More often than not, bugs in the compiler cause it to crash—often due
+to an assertion failure of some sort. The most important
+piece of the puzzle is to figure out if it is crashing in the GCC front-end
+or if it is one of the LLVM libraries (e.g. the optimizer or code generator)
+that has problems.
 
-To figure out which program is crashing (the front-end,
-gccas, or gccld), run the
+To figure out which component is crashing (the front-end,
+optimizer or code generator), run the
 llvm-gcc command line as you were when the crash occurred, but
-add a -v option to the command line.  The compiler will print out a
-bunch of stuff, and should end with telling you that one of
-cc1/cc1plus, gccas, or
-gccld crashed.
+with the following extra command line options:
 
 
+  -O0 -emit-llvm: If llvm-gcc still crashes when
+  passed these options (which disable the optimizer and code generator), then
+  the crash is in the front-end.  Jump ahead to the section on front-end bugs.
+
+  -emit-llvm: If llvm-gcc crashes with this option
+  (which disables the code generator), you found an optimizer bug.  Jump ahead
+  to  compile-time optimization bugs.
 
-  If cc1 or cc1plus crashed, you found a
-  problem with the front-end.
-  Jump ahead to the section on front-end bugs.
-
-  If gccas crashed, you found a bug in one
-  of the passes in gccas.
-
-  If gccld crashed, you found a bug in one
-  of the passes in gccld.
-
-  Otherwise, something really weird happened. Email the list with what you
-  have at this point.
+  Otherwise, you have a code generator crash.  Jump ahead to code generator bugs.
 
 
 
@@ -126,9 +122,10 @@
 llvm-gcc command that resulted in the crash, but add the
 -save-temps option.  The compiler will crash again, but it will leave
 behind a foo.i file (containing preprocessed C source code) and
-possibly foo.s (containing LLVM assembly code) for each
+possibly foo.s for each
 compiled foo.c file. Send us the foo.i file,
-along with a brief description of the error it caused.
+along with the options you passed to llvm-gcc, and a brief description of the
+error it caused.
 
 The http://delta.tigris.org/";>delta tool helps to reduce the
 preprocessed file down to the smallest amount of code that still replicates the
@@ -141,81 +138,72 @@
 
 
 
-  GCCAS bugs
+  Compile-time optimization bugs
 
 
 
 
-If you find that a bug crashes in the gccas stage of
-compilation, compile your test-case to a .s file with the
--save-temps option to llvm-gcc. Then run:
+If you find that a bug crashes in the optimizer, compile your test-case to a
+.bc file by passing "-emit-llvm -O0 -c -o foo.bc".
+Then run:
 
 
-gccas -debug-pass=Arguments < /dev/null -o - > 
/dev/null
-
-
-... which will print a list of arguments, indicating the list of passes that
-gccas runs.  Once

[llvm-commits] [124287] Fix PR1221, which is subtle fallout from the symtab change.

2007-02-24 Thread clattner
Revision: 124287
Author:   clattner
Date: 2007-02-24 17:23:21 -0800 (Sat, 24 Feb 2007)

Log Message:
---
Fix PR1221, which is subtle fallout from the symtab change.
"getName().c_str()" now cannot be used, because the string
returned by getName() is temporary and is destroyed when the
expression is fully evaluated.

Modified Paths:
--
apple-local/branches/llvm/gcc/llvm-backend.cpp

Modified: apple-local/branches/llvm/gcc/llvm-backend.cpp
===
--- apple-local/branches/llvm/gcc/llvm-backend.cpp  2007-02-24 22:46:38 UTC 
(rev 124286)
+++ apple-local/branches/llvm/gcc/llvm-backend.cpp  2007-02-25 01:23:21 UTC 
(rev 124287)
@@ -45,6 +45,7 @@
 #include "llvm/Analysis/LoadValueNumbering.h"
 #include "llvm/Transforms/IPO.h"
 #include "llvm/ADT/StringExtras.h"
+#include "llvm/ADT/StringMap.h"
 #include "llvm/Support/Streams.h"
 #include "llvm/Support/ManagedStatic.h"
 #include 
@@ -860,7 +861,7 @@
 /// llvm_get_decl_name - Used by varasm.c, returns the specified declaration's
 /// name.
 const char *llvm_get_decl_name(void *LLVM) {
-  return ((Value*)LLVM)->getName().c_str();
+  return ((Value*)LLVM)->getValueName()->getKeyData();
 }
 
 // llvm_mark_decl_weak - Used by varasm.c, called when a decl is found to be


___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp

2007-02-24 Thread Chris Lattner


Changes in directory llvm/lib/CodeGen/SelectionDAG:

TargetLowering.cpp updated: 1.94 -> 1.95
---
Log message:

initialize a instance variable


---
Diffs of the changes:  (+1 -0)

 TargetLowering.cpp |1 +
 1 files changed, 1 insertion(+)


Index: llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp:1.94 
llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp:1.95
--- llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp:1.94   Fri Feb 23 
20:09:29 2007
+++ llvm/lib/CodeGen/SelectionDAG/TargetLowering.cppSat Feb 24 19:28:05 2007
@@ -148,6 +148,7 @@
   allowUnalignedMemoryAccesses = false;
   UseUnderscoreSetJmp = false;
   UseUnderscoreLongJmp = false;
+  SelectIsExpensive = false;
   IntDivIsCheap = false;
   Pow2DivIsCheap = false;
   StackPointerRegisterToSaveRestore = 0;



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/ARM/ARMConstantIslandPass.cpp

2007-02-24 Thread Dale Johannesen


Changes in directory llvm/lib/Target/ARM:

ARMConstantIslandPass.cpp updated: 1.28 -> 1.29
---
Log message:

remove crediting of Evan Cheng and me.


---
Diffs of the changes:  (+0 -1)

 ARMConstantIslandPass.cpp |1 -
 1 files changed, 1 deletion(-)


Index: llvm/lib/Target/ARM/ARMConstantIslandPass.cpp
diff -u llvm/lib/Target/ARM/ARMConstantIslandPass.cpp:1.28 
llvm/lib/Target/ARM/ARMConstantIslandPass.cpp:1.29
--- llvm/lib/Target/ARM/ARMConstantIslandPass.cpp:1.28  Sat Feb 24 18:47:03 2007
+++ llvm/lib/Target/ARM/ARMConstantIslandPass.cpp   Sat Feb 24 19:42:36 2007
@@ -4,7 +4,6 @@
 //
 // This file was developed by Chris Lattner and is distributed under the
 // University of Illinois Open Source License. See LICENSE.TXT for details.
-// Substantial modifications by Evan Cheng and Dale Johannesen.
 //
 
//===--===//
 //



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Support/APInt.cpp

2007-02-24 Thread Reid Spencer


Changes in directory llvm/lib/Support:

APInt.cpp updated: 1.38 -> 1.39
---
Log message:

Clean up lshr and ashr to coding standards.
Handle the single word cases for shiftAmt == BitWidth.


---
Diffs of the changes:  (+79 -53)

 APInt.cpp |  132 +-
 1 files changed, 79 insertions(+), 53 deletions(-)


Index: llvm/lib/Support/APInt.cpp
diff -u llvm/lib/Support/APInt.cpp:1.38 llvm/lib/Support/APInt.cpp:1.39
--- llvm/lib/Support/APInt.cpp:1.38 Sat Feb 24 19:08:58 2007
+++ llvm/lib/Support/APInt.cpp  Sat Feb 24 19:56:07 2007
@@ -894,52 +894,59 @@
 /// Arithmetic right-shift this APInt by shiftAmt.
 /// @brief Arithmetic right-shift function.
 APInt APInt::ashr(uint32_t shiftAmt) const {
-  APInt API(*this);
-  if (API.isSingleWord())
-API.VAL = 
-  (((int64_t(API.VAL) << (APINT_BITS_PER_WORD - API.BitWidth)) >> 
-  (APINT_BITS_PER_WORD - API.BitWidth)) >> shiftAmt) & 
-  (~uint64_t(0UL) >> (APINT_BITS_PER_WORD - API.BitWidth));
-  else {
-if (shiftAmt >= API.BitWidth) {
-  memset(API.pVal, API[API.BitWidth-1] ? 1 : 0, 
- (API.getNumWords()-1) * APINT_WORD_SIZE);
-  API.pVal[API.getNumWords() - 1] = 
-~uint64_t(0UL) >> 
-  (APINT_BITS_PER_WORD - API.BitWidth % APINT_BITS_PER_WORD);
-} else {
-  uint32_t i = 0;
-  for (; i < API.BitWidth - shiftAmt; ++i)
-if (API[i+shiftAmt]) 
-  API.set(i);
-else
-  API.clear(i);
-  for (; i < API.BitWidth; ++i)
-if (API[API.BitWidth-1]) 
-  API.set(i);
-else API.clear(i);
-}
+  if (isSingleWord()) {
+if (shiftAmt == BitWidth)
+  return APInt(BitWidth, -1ull);
+else
+  return APInt(BitWidth, 
+(((int64_t(VAL) << (APINT_BITS_PER_WORD - BitWidth)) >> 
+(APINT_BITS_PER_WORD - BitWidth)) >> shiftAmt) & 
+(~uint64_t(0UL) >> (APINT_BITS_PER_WORD - BitWidth)));
+  }
+
+  APInt Result(*this);
+  if (shiftAmt >= BitWidth) {
+memset(Result.pVal, Result[BitWidth-1] ? 1 : 0, 
+   (getNumWords()-1) * APINT_WORD_SIZE);
+Result.pVal[getNumWords() - 1] = ~uint64_t(0UL) >> 
+(APINT_BITS_PER_WORD - BitWidth % APINT_BITS_PER_WORD);
+  } else {
+uint32_t i = 0;
+for (; i < BitWidth - shiftAmt; ++i)
+  if (Result[i+shiftAmt]) 
+Result.set(i);
+  else
+Result.clear(i);
+for (; i < BitWidth; ++i)
+  if (Result[BitWidth-1]) 
+Result.set(i);
+  else 
+Result.clear(i);
   }
-  return API;
+  return Result;
 }
 
 /// Logical right-shift this APInt by shiftAmt.
 /// @brief Logical right-shift function.
 APInt APInt::lshr(uint32_t shiftAmt) const {
-  APInt API(*this);
-  if (API.isSingleWord())
-API.VAL >>= shiftAmt;
-  else {
-if (shiftAmt >= API.BitWidth)
-  memset(API.pVal, 0, API.getNumWords() * APINT_WORD_SIZE);
-uint32_t i = 0;
-for (i = 0; i < API.BitWidth - shiftAmt; ++i)
-  if (API[i+shiftAmt]) API.set(i);
-  else API.clear(i);
-for (; i < API.BitWidth; ++i)
-  API.clear(i);
-  }
-  return API;
+  if (isSingleWord())
+if (shiftAmt == BitWidth)
+  return APInt(BitWidth, 0);
+else 
+  return APInt(BitWidth, this->VAL >> shiftAmt);
+
+  APInt Result(*this);
+  if (shiftAmt >= Result.BitWidth)
+memset(Result.pVal, 0, Result.getNumWords() * APINT_WORD_SIZE);
+  uint32_t i = 0;
+  for (i = 0; i < Result.BitWidth - shiftAmt; ++i)
+if (Result[i+shiftAmt]) 
+  Result.set(i);
+else 
+  Result.clear(i);
+  for (; i < Result.BitWidth; ++i)
+Result.clear(i);
+  return Result;
 }
 
 /// Left-shift this APInt by shiftAmt.
@@ -1197,8 +1204,29 @@
   uint64_t mask = ~0ull >> (sizeof(uint32_t)*8);
   uint32_t n = rhsWords * 2;
   uint32_t m = (lhsWords * 2) - n;
-  // FIXME: allocate space on stack if m and n are sufficiently small.
-  uint32_t *U = new uint32_t[m + n + 1];
+
+  // Allocate space for the temporary values we need either on the stack, if
+  // it will fit, or on the heap if it won't.
+  uint32_t SPACE[128];
+  uint32_t *U = 0;
+  uint32_t *V = 0;
+  uint32_t *Q = 0;
+  uint32_t *R = 0;
+  if ((Remainder?4:3)*n+2*m+1 <= 128) {
+U = &SPACE[0];
+V = &SPACE[m+n+1];
+Q = &SPACE[(m+n+1) + n];
+if (Remainder)
+  R = &SPACE[(m+n+1) + n + (m+n)];
+  } else {
+U = new uint32_t[m + n + 1];
+V = new uint32_t[n];
+Q = new uint32_t[m+n];
+if (Remainder)
+  R = new uint32_t[n];
+  }
+
+  // Initialize the dividend
   memset(U, 0, (m+n+1)*sizeof(uint32_t));
   for (unsigned i = 0; i < lhsWords; ++i) {
 uint64_t tmp = (LHS.getNumWords() == 1 ? LHS.VAL : LHS.pVal[i]);
@@ -1207,7 +1235,7 @@
   }
   U[m+n] = 0; // this extra word is for "spill" in the Knuth algorithm.
 
-  uint32_t *V = new uint32_t[n];
+  // Initialize the divisor
   memset(V, 0, (n)*sizeof(uint32_t));
   for (unsigned i = 0; i < rhsWords; ++i) {
 uint64_t tmp = (RHS.getNumWords() == 1 ? RHS.VAL : RHS.pVal

Re: [llvm-commits] CVS: llvm/lib/Support/APInt.cpp

2007-02-24 Thread Chris Lattner
> / Clean up the memory we allocated.
> -  delete [] U;
> -  delete [] V;
> -  delete [] Q;
> -  delete [] R;
> +  if (U != &SPACE[0]) {
> +delete [] U;
> +delete [] V;
> +delete [] Q;
> +delete [] R;
> +  }
>  }

Please just use SmallVector instead of explicitly doing it  
yourself.

-Chris

___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/LICENSE.TXT

2007-02-24 Thread Chris Lattner


Changes in directory llvm:

LICENSE.TXT updated: 1.29 -> 1.30
---
Log message:

remove these.


---
Diffs of the changes:  (+0 -1)

 LICENSE.TXT |1 -
 1 files changed, 1 deletion(-)


Index: llvm/LICENSE.TXT
diff -u llvm/LICENSE.TXT:1.29 llvm/LICENSE.TXT:1.30
--- llvm/LICENSE.TXT:1.29   Thu Jan 18 15:22:36 2007
+++ llvm/LICENSE.TXTSat Feb 24 20:28:21 2007
@@ -63,7 +63,6 @@
 --- -
 System Library  llvm/lib/System
 Compiler Driver llvm/tools/llvmc
-PowerPC Backend llvm/lib/Target/PowerPC
 bzip2   llvm/lib/Support/bzip2/LICENSE 
 Autoconfllvm/autoconf
 llvm/projects/ModuleMaker/autoconf



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Support/APInt.cpp

2007-02-24 Thread Chris Lattner


Changes in directory llvm/lib/Support:

APInt.cpp updated: 1.39 -> 1.40
---
Log message:

this doesn't compile, disable it


---
Diffs of the changes:  (+4 -0)

 APInt.cpp |4 
 1 files changed, 4 insertions(+)


Index: llvm/lib/Support/APInt.cpp
diff -u llvm/lib/Support/APInt.cpp:1.39 llvm/lib/Support/APInt.cpp:1.40
--- llvm/lib/Support/APInt.cpp:1.39 Sat Feb 24 19:56:07 2007
+++ llvm/lib/Support/APInt.cpp  Sat Feb 24 20:32:44 2007
@@ -26,6 +26,8 @@
 
 using namespace llvm;
 
+#if 0
+
 // A utility function for allocating memory, checking for allocation failures,
 // and ensuring the contents are zeroed.
 inline static uint64_t* getClearedMemory(uint32_t numWords) {
@@ -1587,3 +1589,5 @@
   cerr << " (" << this->toString(10, false) << ")\n" << std::setbase(10);
 }
 #endif
+
+#endif



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCJITInfo.cpp PPCSubtarget.h PPCTargetMachine.cpp

2007-02-24 Thread Chris Lattner


Changes in directory llvm/lib/Target/PowerPC:

PPCJITInfo.cpp updated: 1.36 -> 1.37
PPCSubtarget.h updated: 1.24 -> 1.25
PPCTargetMachine.cpp updated: 1.116 -> 1.117
---
Log message:

Improve JIT support for linux/ppc: Patch by Nicolas Geoffray!


---
Diffs of the changes:  (+70 -2)

 PPCJITInfo.cpp   |   65 +++
 PPCSubtarget.h   |3 ++
 PPCTargetMachine.cpp |4 +--
 3 files changed, 70 insertions(+), 2 deletions(-)


Index: llvm/lib/Target/PowerPC/PPCJITInfo.cpp
diff -u llvm/lib/Target/PowerPC/PPCJITInfo.cpp:1.36 
llvm/lib/Target/PowerPC/PPCJITInfo.cpp:1.37
--- llvm/lib/Target/PowerPC/PPCJITInfo.cpp:1.36 Mon Dec 11 12:10:54 2006
+++ llvm/lib/Target/PowerPC/PPCJITInfo.cpp  Sat Feb 24 23:04:13 2007
@@ -134,6 +134,71 @@
 "mtlr r2\n"
 "bctr\n"
 );
+
+#elif defined(__PPC__) && !defined(__ppc64__)
+// Linux/PPC support
+
+// CompilationCallback stub - We can't use a C function with inline assembly in
+// it, because we the prolog/epilog inserted by GCC won't work for us.  
Instead,
+// write our own wrapper, which does things our way, so we have complete 
control
+// over register saving and restoring.
+asm(
+".text\n"
+".align 2\n"
+".globl PPC32CompilationCallback\n"
+"PPC32CompilationCallback:\n"
+// Make space for 8 ints r[3-10] and 13 doubles f[1-13] and the 
+// FIXME: need to save v[0-19] for altivec?
+// FIXME: could shrink frame
+// Set up a proper stack frame
+// FIXME Layout
+//   PowerPC64 ABI linkage-  24 bytes
+// parameters -  32 bytes
+//   13 double registers  - 104 bytes
+//   8 int registers  -  32 bytes
+"mflr 0\n"
+"stw 0,  4(1)\n"
+"stwu 1, -180(1)\n"
+// Save all int arg registers
+"stw 10, 176(1)\n""stw 9,  172(1)\n"
+"stw 8,  168(1)\n""stw 7,  164(1)\n"
+"stw 6,  160(1)\n""stw 5,  156(1)\n"
+"stw 4,  152(1)\n""stw 3,  148(1)\n"
+// Save all call-clobbered FP regs.
+"stfd 10, 144(1)\n"
+"stfd 9,  136(1)\n"   "stfd 8,  128(1)\n"
+"stfd 7,  120(1)\n"   "stfd 6,  112(1)\n"
+"stfd 5,  104(1)\n"   "stfd 4,   96(1)\n"
+"stfd 3,   88(1)\n"   "stfd 2,   80(1)\n"
+"stfd 1,   72(1)\n"
+// Arguments to Compilation Callback:
+// r3 - our lr (address of the call instruction in stub plus 4)
+// r4 - stub's lr (address of instruction that called the stub plus 4)
+// r5 - is64Bit - always 0.
+"mr   3, 0\n"
+"lwz  11, 180(1)\n" // stub's frame
+"lwz  4, 4(11)\n" // stub's lr
+"li   5, 0\n"   // 0 == 32 bit
+"bl PPCCompilationCallbackC\n"
+"mtctr 3\n"
+// Restore all int arg registers
+"lwz 10, 176(1)\n""lwz 9,  172(1)\n"
+"lwz 8,  168(1)\n""lwz 7,  164(1)\n"
+"lwz 6,  160(1)\n""lwz 5,  156(1)\n"
+"lwz 4,  152(1)\n""lwz 3,  148(1)\n"
+// Restore all FP arg registers
+"lfd 10, 144(1)\n"
+"lfd 9,  136(1)\n""lfd 8,  128(1)\n"
+"lfd 7,  120(1)\n""lfd 6,  112(1)\n"
+"lfd 5,  104(1)\n""lfd 4,   96(1)\n"
+"lfd 3,   88(1)\n""lfd 2,   80(1)\n"
+"lfd 1,   72(1)\n"
+// Pop 3 frames off the stack and branch to target
+"lwz  1, 184(1)\n"
+"lwz  11, 4(1)\n"
+"mtlr 11\n"
+"bctr\n"
+);
 #else
 void PPC32CompilationCallback() {
   assert(0 && "This is not a power pc, you can't execute this!");


Index: llvm/lib/Target/PowerPC/PPCSubtarget.h
diff -u llvm/lib/Target/PowerPC/PPCSubtarget.h:1.24 
llvm/lib/Target/PowerPC/PPCSubtarget.h:1.25
--- llvm/lib/Target/PowerPC/PPCSubtarget.h:1.24 Tue Feb 13 23:52:17 2007
+++ llvm/lib/Target/PowerPC/PPCSubtarget.h  Sat Feb 24 23:04:13 2007
@@ -134,6 +134,9 @@
 
   bool isDarwin() const { return IsDarwin; }
 
+  bool isMachoABI() const { return IsDarwin; }
+  bool isELF_ABI() const { return !IsDarwin; }
+
   unsigned getAsmFlavor() const {
 return AsmFlavor != Unset ? unsigned(AsmFlavor) : 0;
   }


Index: llvm/lib/Target/PowerPC/PPCTargetMachine.cpp
diff -u llvm/lib/Target/PowerPC/PPCTargetMachine.cpp:1.116 
llvm/lib/Target/PowerPC/PPCTargetMachine.cpp:1.117
--- llvm/lib/Target/PowerPC/PPCTargetMachine.cpp:1.116  Wed Feb  7 19:39:44 2007
+++ llvm/lib/Target/PowerPC/PPCTargetMachine.cppSat Feb 24 23:04:13 2007
@@ -35,14 +35,14 @@
 }
 
 unsigned PPC32TargetMachine::getJITMatchQuality() {
-#if defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)
+#if defined(__POWERPC__) || defined (__ppc__) || defined(_POWER) || 
defined(__PPC__)
   if (sizeof(void*) == 4)
 return 10;
 #endif
   return 0;
 }
 unsigned PPC64TargetMachine::getJITMatchQuality() {
-#if defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)
+#if defined(__POWERPC__) || defined (__ppc__) || defined(_POWER) || 
defined(__PPC__)
   if (sizeof(void*) == 8)
 return 10;
 #endif



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo

[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCInstrFormats.td

2007-02-24 Thread Chris Lattner


Changes in directory llvm/lib/Target/PowerPC:

PPCInstrFormats.td updated: 1.88 -> 1.89
---
Log message:

Add XLForm_1_ext template, patch by Nicolas Geoffray.


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

 PPCInstrFormats.td |   38 --
 1 files changed, 24 insertions(+), 14 deletions(-)


Index: llvm/lib/Target/PowerPC/PPCInstrFormats.td
diff -u llvm/lib/Target/PowerPC/PPCInstrFormats.td:1.88 
llvm/lib/Target/PowerPC/PPCInstrFormats.td:1.89
--- llvm/lib/Target/PowerPC/PPCInstrFormats.td:1.88 Wed Dec  6 15:35:10 2006
+++ llvm/lib/Target/PowerPC/PPCInstrFormats.td  Sat Feb 24 23:07:49 2007
@@ -349,21 +349,31 @@
 
 // 1.7.7 XL-Form
 class XLForm_1 opcode, bits<10> xo, dag OL, string asmstr,
-   InstrItinClass itin>
+   InstrItinClass itin, list pattern>
+: I {
+  bits<5> CRD;
+  bits<5> CRA;
+  bits<5> CRB;
+  
+  let Pattern = pattern;
+  
+  let Inst{6-10}  = CRD;
+  let Inst{11-15} = CRA;
+  let Inst{16-20} = CRB;
+  let Inst{21-30} = xo;
+  let Inst{31}= 0;
+}
+
+class XLForm_1_ext opcode, bits<10> xo, dag OL, string asmstr,
+   InstrItinClass itin, list pattern>
 : I {
-  bits<3> CRD;
-  bits<2> CRDb;
-  bits<3> CRA;
-  bits<2> CRAb;
-  bits<3> CRB;
-  bits<2> CRBb;
-  
-  let Inst{6-8}   = CRD;
-  let Inst{9-10}  = CRDb;
-  let Inst{11-13} = CRA;
-  let Inst{14-15} = CRAb;
-  let Inst{16-18} = CRB;
-  let Inst{19-20} = CRBb;
+  bits<5> CRD;
+  
+  let Pattern = pattern;
+  
+  let Inst{6-10}  = CRD;
+  let Inst{11-15} = CRD;
+  let Inst{16-20} = CRD;
   let Inst{21-30} = xo;
   let Inst{31}= 0;
 }



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp PPCFrameInfo.h PPCHazardRecognizers.cpp PPCISelLowering.cpp PPCISelLowering.h PPCInstr64Bit.td PPCInstrInfo.td PPCRegisterInfo.cpp

2007-02-24 Thread Chris Lattner


Changes in directory llvm/lib/Target/PowerPC:

PPCCodeEmitter.cpp updated: 1.74 -> 1.75
PPCFrameInfo.h updated: 1.12 -> 1.13
PPCHazardRecognizers.cpp updated: 1.18 -> 1.19
PPCISelLowering.cpp updated: 1.253 -> 1.254
PPCISelLowering.h updated: 1.58 -> 1.59
PPCInstr64Bit.td updated: 1.38 -> 1.39
PPCInstrInfo.td updated: 1.272 -> 1.273
PPCRegisterInfo.cpp updated: 1.111 -> 1.112
---
Log message:

implement support for the linux/ppc function call ABI.  Patch by
Nicolas Geoffray!



---
Diffs of the changes:  (+343 -102)

 PPCCodeEmitter.cpp   |7 +-
 PPCFrameInfo.h   |   50 +++
 PPCHazardRecognizers.cpp |2 
 PPCISelLowering.cpp  |  149 ++-
 PPCISelLowering.h|2 
 PPCInstr64Bit.td |   44 +++--
 PPCInstrInfo.td  |   64 
 PPCRegisterInfo.cpp  |  127 
 8 files changed, 343 insertions(+), 102 deletions(-)


Index: llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp
diff -u llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp:1.74 
llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp:1.75
--- llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp:1.74 Fri Dec 15 10:44:10 2006
+++ llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp  Sat Feb 24 23:34:32 2007
@@ -133,7 +133,8 @@
   } else if (MO.isGlobalAddress() || MO.isExternalSymbol() ||
  MO.isConstantPoolIndex() || MO.isJumpTableIndex()) {
 unsigned Reloc = 0;
-if (MI.getOpcode() == PPC::BL || MI.getOpcode() == PPC::BL8)
+if (MI.getOpcode() == PPC::BL_Macho || MI.getOpcode() == PPC::BL8_Macho ||
+MI.getOpcode() == PPC::BL_ELF || MI.getOpcode() == PPC::BL8_ELF)
   Reloc = PPC::reloc_pcrel_bx;
 else {
   if (TM.getRelocationModel() == Reloc::PIC_) {
@@ -213,7 +214,9 @@
   } else if (MO.isMachineBasicBlock()) {
 unsigned Reloc = 0;
 unsigned Opcode = MI.getOpcode();
-if (Opcode == PPC::B || Opcode == PPC::BL || Opcode == PPC::BLA)
+if (Opcode == PPC::B || Opcode == PPC::BL_Macho ||
+Opcode == PPC::BLA_Macho || Opcode == PPC::BL_ELF || 
+Opcode == PPC::BLA_ELF)
   Reloc = PPC::reloc_pcrel_bx;
 else // BCC instruction
   Reloc = PPC::reloc_pcrel_bcx;


Index: llvm/lib/Target/PowerPC/PPCFrameInfo.h
diff -u llvm/lib/Target/PowerPC/PPCFrameInfo.h:1.12 
llvm/lib/Target/PowerPC/PPCFrameInfo.h:1.13
--- llvm/lib/Target/PowerPC/PPCFrameInfo.h:1.12 Wed Dec  6 11:42:06 2006
+++ llvm/lib/Target/PowerPC/PPCFrameInfo.h  Sat Feb 24 23:34:32 2007
@@ -29,41 +29,61 @@
 
   /// getReturnSaveOffset - Return the previous frame offset to save the
   /// return address.
-  static unsigned getReturnSaveOffset(bool LP64) {
-return LP64 ? 16 : 8;
+  static unsigned getReturnSaveOffset(bool LP64, bool isMacho) {
+if (isMacho)
+  return LP64 ? 16 : 8;
+// For ELF ABI:
+return LP64 ? 8 : 4;
   }
 
   /// getFramePointerSaveOffset - Return the previous frame offset to save the
   /// frame pointer.
-  static unsigned getFramePointerSaveOffset(bool LP64) {
+  static unsigned getFramePointerSaveOffset(bool LP64, bool isMacho) {
+// For MachO ABI:
 // Use the TOC save slot in the PowerPC linkage area for saving the frame
 // pointer (if needed.)  LLVM does not generate code that uses the TOC (R2
 // is treated as a caller saved register.)
-return LP64 ? 40 : 20;
+if (isMacho)
+  return LP64 ? 40 : 20;
+
+// For ELF ABI:
+// Save it right before the link register
+return LP64 ? -8 : -4;
   }
   
   /// getLinkageSize - Return the size of the PowerPC ABI linkage area.
   ///
-  static unsigned getLinkageSize(bool LP64) {
-return 6 * (LP64 ? 8 : 4);
+  static unsigned getLinkageSize(bool LP64, bool isMacho) {
+if (isMacho)
+  return 6 * (LP64 ? 8 : 4);
+
+// For ELF ABI:
+return LP64 ? 16 : 8;
   }
 
   /// getMinCallArgumentsSize - Return the size of the minium PowerPC ABI
   /// argument area.
-  static unsigned getMinCallArgumentsSize(bool LP64) {
-   // The prolog code of the callee may store up to 8 GPR argument registers to
-   // the stack, allowing va_start to index over them in memory if its varargs.
-   // Because we cannot tell if this is needed on the caller side, we have to
-   // conservatively assume that it is needed.  As such, make sure we have at
-   // least enough stack space for the caller to store the 8 GPRs.
-return 8 * (LP64 ? 8 : 4);
+  static unsigned getMinCallArgumentsSize(bool LP64, bool isMacho) {
+// For Macho ABI:
+// The prolog code of the callee may store up to 8 GPR argument registers 
to
+// the stack, allowing va_start to index over them in memory if its 
varargs.
+// Because we cannot tell if this is needed on the caller side, we have to
+// conservatively assume that it is needed.  As such, make sure we have at
+// least enough stack space for the caller to store the 8 GPRs.
+if (isMacho)
+  return 8 * (LP64 ? 8 : 4);
+  

[llvm-commits] CVS: llvm/test/CodeGen/X86/i128-ret.ll

2007-02-24 Thread Chris Lattner


Changes in directory llvm/test/CodeGen/X86:

i128-ret.ll added (r1.1)
---
Log message:

verify i128 return on x86-64 continues to codegen optimally.


---
Diffs of the changes:  (+8 -0)

 i128-ret.ll |8 
 1 files changed, 8 insertions(+)


Index: llvm/test/CodeGen/X86/i128-ret.ll
diff -c /dev/null llvm/test/CodeGen/X86/i128-ret.ll:1.1
*** /dev/null   Sun Feb 25 00:06:59 2007
--- llvm/test/CodeGen/X86/i128-ret.ll   Sun Feb 25 00:06:49 2007
***
*** 0 
--- 1,8 
+ ; RUN: llvm-as < %s | llc -march=x86-64 | grep 'movq 8(%rdi), %rdx' &&
+ ; RUN: llvm-as < %s | llc -march=x86-64 | grep 'movq (%rdi), %rax'
+ 
+ define i128 @test(i128 *%P) {
+ %A = load i128* %P
+ ret i128 %A
+ }
+ 



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp

2007-02-24 Thread Chris Lattner


Changes in directory llvm/lib/Target/X86:

X86ISelLowering.cpp updated: 1.323 -> 1.324
---
Log message:

remove std::vector's in RET lowering.


---
Diffs of the changes:  (+11 -22)

 X86ISelLowering.cpp |   33 +++--
 1 files changed, 11 insertions(+), 22 deletions(-)


Index: llvm/lib/Target/X86/X86ISelLowering.cpp
diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.323 
llvm/lib/Target/X86/X86ISelLowering.cpp:1.324
--- llvm/lib/Target/X86/X86ISelLowering.cpp:1.323   Thu Feb 22 08:56:36 2007
+++ llvm/lib/Target/X86/X86ISelLowering.cpp Sun Feb 25 00:21:57 2007
@@ -4014,13 +4014,9 @@
 if (DAG.getMachineFunction().liveout_empty())
   DAG.getMachineFunction().addLiveOut(X86::ST0);
 
-std::vector Tys;
-Tys.push_back(MVT::Other);
-Tys.push_back(MVT::Flag);
-std::vector Ops;
-Ops.push_back(Op.getOperand(0));
-Ops.push_back(Op.getOperand(1));
-Copy = DAG.getNode(X86ISD::FP_SET_RESULT, Tys, &Ops[0], Ops.size());
+SDVTList Tys = DAG.getVTList(MVT::Other, MVT::Flag);
+SDOperand Ops[] = { Op.getOperand(0), Op.getOperand(1) };
+Copy = DAG.getNode(X86ISD::FP_SET_RESULT, Tys, Ops, 2);
   } else {
 // FP return with ScalarSSE (return on fp-stack).
 if (DAG.getMachineFunction().liveout_empty())
@@ -4042,21 +4038,14 @@
   MemLoc = DAG.getFrameIndex(SSFI, getPointerTy());
   Chain = DAG.getStore(Op.getOperand(0), Value, MemLoc, NULL, 0);
 }
-std::vector Tys;
-Tys.push_back(MVT::f64);
-Tys.push_back(MVT::Other);
-std::vector Ops;
-Ops.push_back(Chain);
-Ops.push_back(MemLoc);
-Ops.push_back(DAG.getValueType(ArgVT));
-Copy = DAG.getNode(X86ISD::FLD, Tys, &Ops[0], Ops.size());
-Tys.clear();
-Tys.push_back(MVT::Other);
-Tys.push_back(MVT::Flag);
-Ops.clear();
-Ops.push_back(Copy.getValue(1));
-Ops.push_back(Copy);
-Copy = DAG.getNode(X86ISD::FP_SET_RESULT, Tys, &Ops[0], Ops.size());
+SDVTList Tys = DAG.getVTList(MVT::f64, MVT::Other);
+SDOperand Ops[] = { Chain, MemLoc, DAG.getValueType(ArgVT) };
+Copy = DAG.getNode(X86ISD::FLD, Tys, Ops, 3);
+
+Tys = DAG.getVTList(MVT::Other, MVT::Flag);
+Ops[0] = Copy.getValue(1);
+Ops[1] = Copy;
+Copy = DAG.getNode(X86ISD::FP_SET_RESULT, Tys, Ops, 2);
   }
   break;
 }



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp

2007-02-24 Thread Chris Lattner


Changes in directory llvm/lib/Target/X86:

X86ISelLowering.cpp updated: 1.324 -> 1.325
---
Log message:

eliminate temporary vectors created during X86 lowering.


---
Diffs of the changes:  (+47 -70)

 X86ISelLowering.cpp |  117 
 1 files changed, 47 insertions(+), 70 deletions(-)


Index: llvm/lib/Target/X86/X86ISelLowering.cpp
diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.324 
llvm/lib/Target/X86/X86ISelLowering.cpp:1.325
--- llvm/lib/Target/X86/X86ISelLowering.cpp:1.324   Sun Feb 25 00:21:57 2007
+++ llvm/lib/Target/X86/X86ISelLowering.cpp Sun Feb 25 00:40:16 2007
@@ -815,9 +815,8 @@
   } else if (ExternalSymbolSDNode *S = dyn_cast(Callee))
 Callee = DAG.getTargetExternalSymbol(S->getSymbol(), getPointerTy());
 
-  std::vector NodeTys;
-  NodeTys.push_back(MVT::Other);   // Returns a chain
-  NodeTys.push_back(MVT::Flag);// Returns a flag for retval copy to use.
+  // Returns a chain & a flag for retval copy to use.
+  SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
   std::vector Ops;
   Ops.push_back(Chain);
   Ops.push_back(Callee);
@@ -856,10 +855,10 @@
 NumBytesForCalleeToPush = NumSRetBytes;
   }
   
-  NodeTys.clear();
-  NodeTys.push_back(MVT::Other);   // Returns a chain
   if (RetVT != MVT::Other)
-NodeTys.push_back(MVT::Flag);  // Returns a flag for retval copy to use.
+NodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
+  else
+NodeTys = DAG.getVTList(MVT::Other);
   Ops.clear();
   Ops.push_back(Chain);
   Ops.push_back(DAG.getConstant(NumBytes, getPointerTy()));
@@ -870,19 +869,18 @@
 InFlag = Chain.getValue(1);
 
   std::vector ResultVals;
-  NodeTys.clear();
   switch (RetVT) {
   default: assert(0 && "Unknown value type to return!");
   case MVT::Other: break;
   case MVT::i8:
 Chain = DAG.getCopyFromReg(Chain, X86::AL, MVT::i8, InFlag).getValue(1);
 ResultVals.push_back(Chain.getValue(0));
-NodeTys.push_back(MVT::i8);
+NodeTys = DAG.getVTList(MVT::i8, MVT::Other);
 break;
   case MVT::i16:
 Chain = DAG.getCopyFromReg(Chain, X86::AX, MVT::i16, InFlag).getValue(1);
 ResultVals.push_back(Chain.getValue(0));
-NodeTys.push_back(MVT::i16);
+NodeTys = DAG.getVTList(MVT::i16, MVT::Other);
 break;
   case MVT::i32:
 if (Op.Val->getValueType(1) == MVT::i32) {
@@ -891,12 +889,12 @@
   Chain = DAG.getCopyFromReg(Chain, X86::EDX, MVT::i32,
  Chain.getValue(2)).getValue(1);
   ResultVals.push_back(Chain.getValue(0));
-  NodeTys.push_back(MVT::i32);
+  NodeTys = DAG.getVTList(MVT::i32, MVT::i32, MVT::Other);
 } else {
   Chain = DAG.getCopyFromReg(Chain, X86::EAX, MVT::i32, 
InFlag).getValue(1);
   ResultVals.push_back(Chain.getValue(0));
+  NodeTys = DAG.getVTList(MVT::i32, MVT::Other);
 }
-NodeTys.push_back(MVT::i32);
 break;
   case MVT::v16i8:
   case MVT::v8i16:
@@ -907,7 +905,7 @@
 assert(!isStdCall && "Unknown value type to return!");
 Chain = DAG.getCopyFromReg(Chain, X86::XMM0, RetVT, InFlag).getValue(1);
 ResultVals.push_back(Chain.getValue(0));
-NodeTys.push_back(RetVT);
+NodeTys = DAG.getVTList(RetVT, MVT::Other);
 break;
   case MVT::f32:
   case MVT::f64: {
@@ -947,7 +945,7 @@
   // operation is okay to eliminate if we allow excess FP precision.
   RetVal = DAG.getNode(ISD::FP_ROUND, MVT::f32, RetVal);
 ResultVals.push_back(RetVal);
-NodeTys.push_back(RetVT);
+NodeTys = DAG.getVTList(RetVT, MVT::Other);
 break;
   }
   }
@@ -957,7 +955,6 @@
 return Chain;
 
   // Otherwise, merge everything together with a MERGE_VALUES node.
-  NodeTys.push_back(MVT::Other);
   ResultVals.push_back(Chain);
   SDOperand Res = DAG.getNode(ISD::MERGE_VALUES, NodeTys,
   &ResultVals[0], ResultVals.size());
@@ -1367,9 +1364,8 @@
   } else if (ExternalSymbolSDNode *S = dyn_cast(Callee))
 Callee = DAG.getTargetExternalSymbol(S->getSymbol(), getPointerTy());
 
-  std::vector NodeTys;
-  NodeTys.push_back(MVT::Other);   // Returns a chain
-  NodeTys.push_back(MVT::Flag);// Returns a flag for retval copy to use.
+  // Returns a chain & a flag for retval copy to use.
+  SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
   std::vector Ops;
   Ops.push_back(Chain);
   Ops.push_back(Callee);
@@ -1388,10 +1384,11 @@
   NodeTys, &Ops[0], Ops.size());
   InFlag = Chain.getValue(1);
 
-  NodeTys.clear();
-  NodeTys.push_back(MVT::Other);   // Returns a chain
   if (RetVT != MVT::Other)
-NodeTys.push_back(MVT::Flag);  // Returns a flag for retval copy to use.
+// Returns a flag for retval copy to use.
+NodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
+  else
+NodeTys = DAG.getVTList(MVT::Other);
   Ops.clear();
   Ops.push_back(Chain);
   Ops.push_back(DAG.getConstant(NumBytes, getPointerTy()));
@@ -1402,24 +1399,23 @@
 InFlag = Chain.getValue(1);
 
   std::vector ResultVal

[llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp

2007-02-24 Thread Chris Lattner


Changes in directory llvm/lib/Target/X86:

X86ISelLowering.cpp updated: 1.325 -> 1.326
---
Log message:

eliminate a bunch more temporary vectors from X86 lowering.


---
Diffs of the changes:  (+141 -176)

 X86ISelLowering.cpp |  317 +++-
 1 files changed, 141 insertions(+), 176 deletions(-)


Index: llvm/lib/Target/X86/X86ISelLowering.cpp
diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.325 
llvm/lib/Target/X86/X86ISelLowering.cpp:1.326
--- llvm/lib/Target/X86/X86ISelLowering.cpp:1.325   Sun Feb 25 00:40:16 2007
+++ llvm/lib/Target/X86/X86ISelLowering.cpp Sun Feb 25 01:10:00 2007
@@ -520,7 +520,7 @@
   MachineFunction &MF = DAG.getMachineFunction();
   MachineFrameInfo *MFI = MF.getFrameInfo();
   SDOperand Root = Op.getOperand(0);
-  std::vector ArgValues;
+  SmallVector ArgValues;
   bool isVarArg = cast(Op.getOperand(2))->getValue() != 0;
 
   // Add DAG nodes to load the arguments...  On entry to a function on the X86,
@@ -549,8 +549,8 @@
   };
   
   // Handle regparm attribute
-  std::vector ArgInRegs(NumArgs, false);
-  std::vector SRetArgs(NumArgs, false);
+  SmallVector ArgInRegs(NumArgs, false);
+  SmallVector SRetArgs(NumArgs, false);
   if (!isVarArg) {
 for (unsigned i = 0; i(Op.getOperand(3+i))->getValue();
@@ -642,9 +642,8 @@
   MF.getInfo()->setBytesToPopOnReturn(BytesToPopOnReturn);
 
   // Return the new list of results.
-  std::vector RetVTs(Op.Val->value_begin(),
- Op.Val->value_end());
-  return DAG.getNode(ISD::MERGE_VALUES, RetVTs, 
&ArgValues[0],ArgValues.size());
+  return DAG.getNode(ISD::MERGE_VALUES, Op.Val->getVTList(),
+ &ArgValues[0], ArgValues.size());
 }
 
 SDOperand X86TargetLowering::LowerallTo(SDOperand Op, SelectionDAG &DAG,
@@ -673,8 +672,8 @@
   unsigned NumSRetBytes= 0; 
 
   // Handle regparm attribute
-  std::vector ArgInRegs(NumOps, false);
-  std::vector SRetArgs(NumOps, false);
+  SmallVector ArgInRegs(NumOps, false);
+  SmallVector SRetArgs(NumOps, false);
   for (unsigned i = 0; i(Op.getOperand(5+2*i+1))->getValue();
@@ -714,8 +713,8 @@
   unsigned ArgOffset = 0;
   NumXMMRegs = 0;
   NumIntRegs = 0;
-  std::vector > RegsToPass;
-  std::vector MemOpChains;
+  SmallVector, 8> RegsToPass;
+  SmallVector MemOpChains;
   SDOperand StackPtr = DAG.getRegister(X86StackPtr, getPointerTy());
   for (unsigned i = 0; i != NumOps; ++i) {
 SDOperand Arg = Op.getOperand(5+2*i);
@@ -817,7 +816,7 @@
 
   // Returns a chain & a flag for retval copy to use.
   SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
-  std::vector Ops;
+  SmallVector Ops;
   Ops.push_back(Chain);
   Ops.push_back(Callee);
 
@@ -868,7 +867,7 @@
   if (RetVT != MVT::Other)
 InFlag = Chain.getValue(1);
 
-  std::vector ResultVals;
+  SmallVector ResultVals;
   switch (RetVT) {
   default: assert(0 && "Unknown value type to return!");
   case MVT::Other: break;
@@ -909,15 +908,9 @@
 break;
   case MVT::f32:
   case MVT::f64: {
-std::vector Tys;
-Tys.push_back(MVT::f64);
-Tys.push_back(MVT::Other);
-Tys.push_back(MVT::Flag);
-std::vector Ops;
-Ops.push_back(Chain);
-Ops.push_back(InFlag);
-SDOperand RetVal = DAG.getNode(X86ISD::FP_GET_RESULT, Tys,
-   &Ops[0], Ops.size());
+SDVTList Tys = DAG.getVTList(MVT::f64, MVT::Other, MVT::Flag);
+SDOperand GROps[] = { Chain, InFlag };
+SDOperand RetVal = DAG.getNode(X86ISD::FP_GET_RESULT, Tys, GROps, 2);
 Chain  = RetVal.getValue(1);
 InFlag = RetVal.getValue(2);
 if (X86ScalarSSE) {
@@ -927,15 +920,11 @@
   MachineFunction &MF = DAG.getMachineFunction();
   int SSFI = MF.getFrameInfo()->CreateStackObject(8, 8);
   SDOperand StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
-  Tys.clear();
-  Tys.push_back(MVT::Other);
-  Ops.clear();
-  Ops.push_back(Chain);
-  Ops.push_back(RetVal);
-  Ops.push_back(StackSlot);
-  Ops.push_back(DAG.getValueType(RetVT));
-  Ops.push_back(InFlag);
-  Chain = DAG.getNode(X86ISD::FST, Tys, &Ops[0], Ops.size());
+  Tys = DAG.getVTList(MVT::Other);
+  SDOperand Ops[] = {
+Chain, RetVal, StackSlot, DAG.getValueType(RetVT), InFlag
+  };
+  Chain = DAG.getNode(X86ISD::FST, Tys, Ops, 5);
   RetVal = DAG.getLoad(RetVT, Chain, StackSlot, NULL, 0);
   Chain = RetVal.getValue(1);
 }
@@ -1031,7 +1020,7 @@
   MachineFrameInfo *MFI = MF.getFrameInfo();
   SDOperand Root = Op.getOperand(0);
   bool isVarArg = cast(Op.getOperand(2))->getValue() != 0;
-  std::vector ArgValues;
+  SmallVector ArgValues;
 
   // Add DAG nodes to load the arguments...  On entry to a function on the X86,
   // the stack frame looks like this:
@@ -1153,7 +1142,7 @@
 RegSaveFrameIndex = MFI->CreateStackObject(6 * 8 + 8 * 16, 16);
 
 // Store the integer parameter registers.
-std::vector MemOps;
+SmallVector MemOps;
 SDOperand RSFIN = DAG.ge

[llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp

2007-02-24 Thread Chris Lattner


Changes in directory llvm/lib/Target/X86:

X86ISelLowering.cpp updated: 1.326 -> 1.327
---
Log message:

make void-return not a special case


---
Diffs of the changes:  (+17 -33)

 X86ISelLowering.cpp |   50 +-
 1 files changed, 17 insertions(+), 33 deletions(-)


Index: llvm/lib/Target/X86/X86ISelLowering.cpp
diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.326 
llvm/lib/Target/X86/X86ISelLowering.cpp:1.327
--- llvm/lib/Target/X86/X86ISelLowering.cpp:1.326   Sun Feb 25 01:10:00 2007
+++ llvm/lib/Target/X86/X86ISelLowering.cpp Sun Feb 25 01:18:38 2007
@@ -854,10 +854,7 @@
 NumBytesForCalleeToPush = NumSRetBytes;
   }
   
-  if (RetVT != MVT::Other)
-NodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
-  else
-NodeTys = DAG.getVTList(MVT::Other);
+  NodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
   Ops.clear();
   Ops.push_back(Chain);
   Ops.push_back(DAG.getConstant(NumBytes, getPointerTy()));
@@ -870,7 +867,9 @@
   SmallVector ResultVals;
   switch (RetVT) {
   default: assert(0 && "Unknown value type to return!");
-  case MVT::Other: break;
+  case MVT::Other:
+NodeTys = DAG.getVTList(MVT::Other);
+break;
   case MVT::i8:
 Chain = DAG.getCopyFromReg(Chain, X86::AL, MVT::i8, InFlag).getValue(1);
 ResultVals.push_back(Chain.getValue(0));
@@ -939,11 +938,7 @@
   }
   }
 
-  // If the function returns void, just return the chain.
-  if (ResultVals.empty())
-return Chain;
-
-  // Otherwise, merge everything together with a MERGE_VALUES node.
+  // Merge everything together with a MERGE_VALUES node.
   ResultVals.push_back(Chain);
   SDOperand Res = DAG.getNode(ISD::MERGE_VALUES, NodeTys,
   &ResultVals[0], ResultVals.size());
@@ -1372,11 +1367,8 @@
   NodeTys, &Ops[0], Ops.size());
   InFlag = Chain.getValue(1);
 
-  if (RetVT != MVT::Other)
-// Returns a flag for retval copy to use.
-NodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
-  else
-NodeTys = DAG.getVTList(MVT::Other);
+  // Returns a flag for retval copy to use.
+  NodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
   Ops.clear();
   Ops.push_back(Chain);
   Ops.push_back(DAG.getConstant(NumBytes, getPointerTy()));
@@ -1389,7 +1381,9 @@
   SmallVector ResultVals;
   switch (RetVT) {
   default: assert(0 && "Unknown value type to return!");
-  case MVT::Other: break;
+  case MVT::Other:
+NodeTys = DAG.getVTList(MVT::Other);
+break;
   case MVT::i8:
 Chain = DAG.getCopyFromReg(Chain, X86::AL, MVT::i8, InFlag).getValue(1);
 ResultVals.push_back(Chain.getValue(0));
@@ -1435,11 +1429,7 @@
 break;
   }
 
-  // If the function returns void, just return the chain.
-  if (ResultVals.empty())
-return Chain;
-
-  // Otherwise, merge everything together with a MERGE_VALUES node.
+  // Merge everything together with a MERGE_VALUES node.
   ResultVals.push_back(Chain);
   SDOperand Res = DAG.getNode(ISD::MERGE_VALUES, NodeTys,
   &ResultVals[0], ResultVals.size());
@@ -1812,11 +1802,8 @@
   NodeTys, &Ops[0], Ops.size());
   InFlag = Chain.getValue(1);
 
-  if (RetVT != MVT::Other)
-// Returns a flag for retval copy to use.
-NodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
-  else
-NodeTys = DAG.getVTList(MVT::Other);
+  // Returns a flag for retval copy to use.
+  NodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
   Ops.clear();
   Ops.push_back(Chain);
   Ops.push_back(DAG.getConstant(NumBytes, getPointerTy()));
@@ -1829,7 +1816,9 @@
   SmallVector ResultVals;
   switch (RetVT) {
   default: assert(0 && "Unknown value type to return!");
-  case MVT::Other: break;
+  case MVT::Other:
+NodeTys = DAG.getVTList(MVT::Other);
+break;
   case MVT::i8:
 Chain = DAG.getCopyFromReg(Chain, X86::AL, MVT::i8, InFlag).getValue(1);
 ResultVals.push_back(Chain.getValue(0));
@@ -1908,12 +1897,7 @@
   }
   }
 
-
-  // If the function returns void, just return the chain.
-  if (ResultVals.empty())
-return Chain;
-
-  // Otherwise, merge everything together with a MERGE_VALUES node.
+  // Merge everything together with a MERGE_VALUES node.
   ResultVals.push_back(Chain);
   SDOperand Res = DAG.getNode(ISD::MERGE_VALUES, NodeTys,
   &ResultVals[0], ResultVals.size());



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/include/llvm/ADT/APInt.h

2007-02-24 Thread Reid Spencer


Changes in directory llvm/include/llvm/ADT:

APInt.h updated: 1.17 -> 1.18
---
Log message:

Add a private constructor for efficiency.


---
Diffs of the changes:  (+4 -0)

 APInt.h |4 
 1 files changed, 4 insertions(+)


Index: llvm/include/llvm/ADT/APInt.h
diff -u llvm/include/llvm/ADT/APInt.h:1.17 llvm/include/llvm/ADT/APInt.h:1.18
--- llvm/include/llvm/ADT/APInt.h:1.17  Sat Feb 24 03:50:13 2007
+++ llvm/include/llvm/ADT/APInt.h   Sun Feb 25 01:29:03 2007
@@ -60,6 +60,7 @@
 /// @brief Class for arbitrary precision integers.
 class APInt {
 public:
+
   uint32_t BitWidth;  ///< The number of bits in this APInt.
 
   /// This union is used to store the integer value. When the
@@ -76,6 +77,9 @@
 APINT_WORD_SIZE = sizeof(uint64_t)
   };
 
+  // Fast internal constructor
+  APInt(uint64_t* val, uint32_t bits) : BitWidth(bits), pVal(val) { }
+
   /// Here one word's bitwidth equals to that of uint64_t.
   /// @returns the number of words to hold the integer value of this APInt.
   /// @brief Get the number of words.



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Support/APInt.cpp

2007-02-24 Thread Reid Spencer


Changes in directory llvm/lib/Support:

APInt.cpp updated: 1.40 -> 1.41
---
Log message:

Allow this to compile now that the header file is checked in.


---
Diffs of the changes:  (+0 -4)

 APInt.cpp |4 
 1 files changed, 4 deletions(-)


Index: llvm/lib/Support/APInt.cpp
diff -u llvm/lib/Support/APInt.cpp:1.40 llvm/lib/Support/APInt.cpp:1.41
--- llvm/lib/Support/APInt.cpp:1.40 Sat Feb 24 20:32:44 2007
+++ llvm/lib/Support/APInt.cpp  Sun Feb 25 01:30:14 2007
@@ -26,8 +26,6 @@
 
 using namespace llvm;
 
-#if 0
-
 // A utility function for allocating memory, checking for allocation failures,
 // and ensuring the contents are zeroed.
 inline static uint64_t* getClearedMemory(uint32_t numWords) {
@@ -1589,5 +1587,3 @@
   cerr << " (" << this->toString(10, false) << ")\n" << std::setbase(10);
 }
 #endif
-
-#endif



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits