[llvm-commits] CVS: llvm/lib/System/Unix/Program.inc

2007-04-23 Thread Reid Spencer


Changes in directory llvm/lib/System/Unix:

Program.inc updated: 1.23 -> 1.24
---
Log message:

Cygwin doesn't have the RSS_LIMIT for get/setrlimit.


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

 Program.inc |2 ++
 1 files changed, 2 insertions(+)


Index: llvm/lib/System/Unix/Program.inc
diff -u llvm/lib/System/Unix/Program.inc:1.23 
llvm/lib/System/Unix/Program.inc:1.24
--- llvm/lib/System/Unix/Program.inc:1.23   Fri Feb 16 13:11:06 2007
+++ llvm/lib/System/Unix/Program.incMon Apr 23 02:22:51 2007
@@ -119,10 +119,12 @@
   getrlimit (RLIMIT_DATA, &r);
   r.rlim_cur = limit;
   setrlimit (RLIMIT_DATA, &r);
+#ifndef __CYGWIN__
   // Resident set size.
   getrlimit (RLIMIT_RSS, &r);
   r.rlim_cur = limit;
   setrlimit (RLIMIT_RSS, &r);
+#endif
   // Virtual memory.
   getrlimit (RLIMIT_AS, &r);
   r.rlim_cur = limit;



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


Re: [llvm-commits] CVS: llvm/test/lib/llvm.exp

2007-04-23 Thread Duncan Sands
Hi Reid,

> +  if { [ string first "$lang" "$llvmgcc_langs" ] >= 0 } {

won't c match c,c++,objc and objc++; and c++ match both c++ and objc++,
etc?

Best wishes,

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


[llvm-commits] CVS: llvm/win32/Bitcode/Bitcode.vcproj

2007-04-23 Thread Jeff Cohen


Changes in directory llvm/win32/Bitcode:

Bitcode.vcproj updated: 1.1 -> 1.2
---
Log message:

Unbreak VC++ build.

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

 Bitcode.vcproj |4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)


Index: llvm/win32/Bitcode/Bitcode.vcproj
diff -u llvm/win32/Bitcode/Bitcode.vcproj:1.1 
llvm/win32/Bitcode/Bitcode.vcproj:1.2
--- llvm/win32/Bitcode/Bitcode.vcproj:1.1   Sun Apr 22 10:00:52 2007
+++ llvm/win32/Bitcode/Bitcode.vcproj   Mon Apr 23 08:55:05 2007
@@ -149,10 +149,10 @@

RelativePath="..\..\include\llvm\Bitcode\BitstreamWriter.h">


+   
RelativePath="..\..\include\llvm\Bitcode\LLVMBitCodes.h">


+   
RelativePath="..\..\include\llvm\Bitcode\ReaderWriter.h">






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


[llvm-commits] CVS: llvm-www/ProjectsWithLLVM/index.html

2007-04-23 Thread Chris Lattner


Changes in directory llvm-www/ProjectsWithLLVM:

index.html updated: 1.34 -> 1.35
---
Log message:

add the calysto checker


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

 index.html |   56 
 1 files changed, 56 insertions(+)


Index: llvm-www/ProjectsWithLLVM/index.html
diff -u llvm-www/ProjectsWithLLVM/index.html:1.34 
llvm-www/ProjectsWithLLVM/index.html:1.35
--- llvm-www/ProjectsWithLLVM/index.html:1.34   Mon Mar 26 14:05:37 2007
+++ llvm-www/ProjectsWithLLVM/index.htmlMon Apr 23 10:39:59 2007
@@ -35,6 +35,7 @@
 
 
 
+Calysto Static Checker
 Improvements on SSA-Based Register Allocation
 LENS Project
 Trident Compiler
@@ -57,6 +58,61 @@
 
 

 
+Calysto Static Checker
+
+
+
+
+
+By Domagoj Babic, UBC.
+
+
+
+
+
+http://www.cs.ubc.ca/~babic/index_calysto.htm";>Calysto
+is a scalable context- and path-sensitive SSA-based static
+assertion checker. Unlike other static
+checkers, Calysto analyzes SSA directly, which means that it not only
+checks the original code, but also the front-end (including
+SSA-optimizations) of the compiler which
+was used to compile the code. The advantage of doing static checking on
+the SSA is language independency and the fact that the checked code is much
+closer to the generated assembly than the source code.
+
+
+
+Several main factors contribute to Calysto's scalability:
+   
+  A novel SSA symbolic execution algorithm that exploits the
+ structure of the control flow graph to minimize the number of
+ paths that need to be considered.
+
+  Lazy interprocedural analysis.
+  Tight integration with the
+   http://www.cs.ubc.ca/~babic/index_spear.htm";>Spear
+   automated theorem prover, designed for software static
+   checking.
+  And, of course, fast implementations of the basic algorithms
+ in LLVM (dominator trees, postdominance, etc.).
+  
+
+
+
+Currently, Calysto is still in the development phase, and the first results
+are encouraging. Most likely, the first public release will happen some
+time in the fall 2007.
+http://www.cs.ubc.ca/~babic/index_spear.htm";>Spear
+and Calysto generated
+http://www.cs.ubc.ca/~babic/index_benchmarks.htm";>benchmarks
+are available.
+
+
+
+
+
+
+
   Improvements on SSA-Based Register Allocation.
 
 



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


[llvm-commits] CVS: llvm-www/Users.html

2007-04-23 Thread John Criswell


Changes in directory llvm-www:

Users.html updated: 1.15 -> 1.16
---
Log message:

Add Abo Akademi University's NECST project per Sebastien Lafond's request.


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

 Users.html |   10 +-
 1 files changed, 9 insertions(+), 1 deletion(-)


Index: llvm-www/Users.html
diff -u llvm-www/Users.html:1.15 llvm-www/Users.html:1.16
--- llvm-www/Users.html:1.15Sat Apr  7 11:22:50 2007
+++ llvm-www/Users.html Mon Apr 23 10:44:54 2007
@@ -81,6 +81,14 @@
 Description
   
 
+  
+  
+http://www.abo.fi/";>Åbo Akademi University
+Johan Lilius's Research Group, ES Lab
+http://www.abo.fi/~johan.lilius/research/page12/page0/necst.html";>NECST 
project
+
+  
+
   
   
 http://www.ugent.be/";>Ghent University
@@ -238,6 +246,6 @@
   src="http://www.w3.org/Icons/valid-html401"; alt="Valid HTML 4.01!">
 
 mailto:[EMAIL PROTECTED]">LLVM Development List
-  Last modified: $Date: 2007/04/07 16:22:50 $
+  Last modified: $Date: 2007/04/23 15:44:54 $
 
 



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


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

2007-04-23 Thread Chris Lattner


Changes in directory llvm/lib/Bitcode/Writer:

Writer.cpp updated: 1.2 -> 1.3
---
Log message:

first part of implementation of abbrevs.  The writer isn't fully there yet and 
the
reader doesn't handle them at all yet.


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

 Writer.cpp |   45 +++--
 1 files changed, 39 insertions(+), 6 deletions(-)


Index: llvm/lib/Bitcode/Writer/Writer.cpp
diff -u llvm/lib/Bitcode/Writer/Writer.cpp:1.2 
llvm/lib/Bitcode/Writer/Writer.cpp:1.3
--- llvm/lib/Bitcode/Writer/Writer.cpp:1.2  Sun Apr 22 20:01:37 2007
+++ llvm/lib/Bitcode/Writer/Writer.cpp  Mon Apr 23 11:04:05 2007
@@ -200,10 +200,14 @@
 WriteStringRecord(bitc::MODULE_CODE_ASM, M->getModuleInlineAsm(),
   0/*TODO*/, Stream);
 
-  // Emit information about sections.
+  // Emit information about sections, computing how many there are.  Also
+  // compute the maximum alignment value.
   std::map SectionMap;
+  unsigned MaxAlignment = 0;
   for (Module::const_global_iterator GV = M->global_begin(),E = 
M->global_end();
GV != E; ++GV) {
+MaxAlignment = std::max(MaxAlignment, GV->getAlignment());
+
 if (!GV->hasSection()) continue;
 // Give section names unique ID's.
 unsigned &Entry = SectionMap[GV->getSection()];
@@ -213,6 +217,7 @@
 Entry = SectionMap.size();
   }
   for (Module::const_iterator F = M->begin(), E = M->end(); F != E; ++F) {
+MaxAlignment = std::max(MaxAlignment, F->getAlignment());
 if (!F->hasSection()) continue;
 // Give section names unique ID's.
 unsigned &Entry = SectionMap[F->getSection()];
@@ -222,13 +227,37 @@
 Entry = SectionMap.size();
   }
   
-  // TODO: Emit abbrev, now that we know # sections.
+  // Emit abbrev for globals, now that we know # sections and max alignment.
+  unsigned SimpleGVarAbbrev = 0;
+  if (!M->global_empty() && 0) { 
+// Add an abbrev for common globals with no visibility or thread localness.
+BitCodeAbbrev *Abbv = new BitCodeAbbrev();
+Abbv->Add(BitCodeAbbrevOp(bitc::MODULE_CODE_GLOBALVAR));
+Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::FixedWidth, 1)); // Constant.
+Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));// Initializer.
+Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::FixedWidth, 3)); // Linkage.
+if (MaxAlignment == 0) // Alignment.
+  Abbv->Add(BitCodeAbbrevOp(0));
+else {
+  unsigned MaxEncAlignment = Log2_32(MaxAlignment)+1;
+  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::FixedWidth,
+   Log2_32_Ceil(MaxEncAlignment)));
+}
+if (SectionMap.empty())// Section.
+  Abbv->Add(BitCodeAbbrevOp(0));
+else
+  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::FixedWidth,
+   Log2_32_Ceil(SectionMap.size(;
+// Don't bother emitting vis + thread local.
+SimpleGVarAbbrev = Stream.EmitAbbrev(Abbv);
+  }
   
   // Emit the global variable information.
   SmallVector Vals;
   for (Module::const_global_iterator GV = M->global_begin(),E = 
M->global_end();
GV != E; ++GV) {
-
+unsigned AbbrevToUse = 0;
+
 // GLOBALVAR: [type, isconst, initid, 
 // linkage, alignment, section, visibility, threadlocal]
 Vals.push_back(VE.getTypeID(GV->getType()));
@@ -238,10 +267,14 @@
 Vals.push_back(getEncodedLinkage(GV));
 Vals.push_back(Log2_32(GV->getAlignment())+1);
 Vals.push_back(GV->hasSection() ? SectionMap[GV->getSection()] : 0);
-Vals.push_back(getEncodedVisibility(GV));
-Vals.push_back(GV->isThreadLocal());
+if (GV->isThreadLocal() || 
+GV->getVisibility() != GlobalValue::DefaultVisibility) {
+  Vals.push_back(getEncodedVisibility(GV));
+  Vals.push_back(GV->isThreadLocal());
+} else {
+  AbbrevToUse = SimpleGVarAbbrev;
+}
 
-unsigned AbbrevToUse = 0;
 Stream.EmitRecord(bitc::MODULE_CODE_GLOBALVAR, Vals, AbbrevToUse);
 Vals.clear();
   }



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


[llvm-commits] CVS: llvm/include/llvm/Bitcode/BitCodes.h BitstreamReader.h BitstreamWriter.h

2007-04-23 Thread Chris Lattner


Changes in directory llvm/include/llvm/Bitcode:

BitCodes.h updated: 1.1 -> 1.2
BitstreamReader.h updated: 1.3 -> 1.4
BitstreamWriter.h updated: 1.2 -> 1.3
---
Log message:

first part of implementation of abbrevs.  The writer isn't fully there yet and 
the
reader doesn't handle them at all yet.


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

 BitCodes.h|   65 +++---
 BitstreamReader.h |3 --
 BitstreamWriter.h |   54 +++-
 3 files changed, 109 insertions(+), 13 deletions(-)


Index: llvm/include/llvm/Bitcode/BitCodes.h
diff -u llvm/include/llvm/Bitcode/BitCodes.h:1.1 
llvm/include/llvm/Bitcode/BitCodes.h:1.2
--- llvm/include/llvm/Bitcode/BitCodes.h:1.1Sun Apr 22 01:22:05 2007
+++ llvm/include/llvm/Bitcode/BitCodes.hMon Apr 23 11:04:05 2007
@@ -18,6 +18,10 @@
 #ifndef LLVM_BITCODE_BITCODES_H
 #define LLVM_BITCODE_BITCODES_H
 
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/Support/DataTypes.h"
+#include 
+
 namespace llvm {
 namespace bitc {
   enum StandardWidths {
@@ -31,16 +35,71 @@
   enum FixedCodes {
 END_BLOCK = 0,  // Must be zero to guarantee termination for broken 
bitcode.
 ENTER_SUBBLOCK = 1,
+
+/// DEFINE_ABBREV - Defines an abbrev for the current block.  It consists
+/// of a vbr5 for # operand infos.  Each operand info is emitted with a
+/// single bit to indicate if it is a literal encoding.  If so, the value 
is
+/// emitted with a vbr8.  If not, the encoding is emitted as 3 bits 
followed
+/// by the info value as a vbr5 if needed.
+DEFINE_ABBREV = 2, 
 
-// Two codes are reserved for defining abbrevs and for emitting an
-// unabbreviated record.
-DEFINE_ABBREVS = 2,
+// UNABBREV_RECORDs are emitted with a vbr6 for the record code, followed 
by
+// a vbr6 for the # operands, followed by vbr6's for each operand.
 UNABBREV_RECORD = 3,
 
 // This is not a code, this is a marker for the first abbrev assignment.
 FIRST_ABBREV = 4
   };
 } // End bitc namespace
+
+/// BitCodeAbbrevOp - This describes one or more operands in an abbreviation.
+/// This is actually a union of two different things:
+///   1. It could be a literal integer value ("the operand is always 17").
+///   2. It could be an encoding specification ("this operand encoded like 
so").
+///
+class BitCodeAbbrevOp {
+  uint64_t Val;// A literal value or data for an encoding.
+  bool IsLiteral : 1;  // Indicate whether this is a literal value or not.
+  unsigned Enc   : 3;  // The encoding to use.
+public:
+  enum Encoding {
+FixedWidth = 1,   // A fixed with field, Val specifies number of bits.
+VBR= 2   // A VBR field where Val specifies the width of each 
chunk.
+  };
+
+  BitCodeAbbrevOp(uint64_t V) :  Val(V), IsLiteral(true) {}
+  BitCodeAbbrevOp(Encoding E, uint64_t Data)
+: Val(Data), IsLiteral(false), Enc(E) {}
+  
+  bool isLiteral() const { return IsLiteral; }
+  bool isEncoding() const { return !IsLiteral; }
+
+  // Accessors for literals.
+  uint64_t getLiteralValue() const { assert(isLiteral()); return Val; }
+  
+  // Accessors for encoding info.
+  Encoding getEncoding() const { assert(isEncoding()); return (Encoding)Enc; }
+  uint64_t getEncodingData() const { assert(isEncoding()); return Val; }
+  
+  bool hasEncodingData() const { return hasEncodingData(getEncoding()); }
+  static bool hasEncodingData(Encoding E) {
+return true; 
+  }
+};
+
+class BitCodeAbbrev {
+  SmallVector OperandList;
+public:
+  
+  unsigned getNumOperandInfos() const { return OperandList.size(); }
+  const BitCodeAbbrevOp &getOperandInfo(unsigned N) const {
+return OperandList[N];
+  }
+  
+  void Add(const BitCodeAbbrevOp &OpInfo) {
+OperandList.push_back(OpInfo);
+  }
+};
 } // End llvm namespace
 
 #endif


Index: llvm/include/llvm/Bitcode/BitstreamReader.h
diff -u llvm/include/llvm/Bitcode/BitstreamReader.h:1.3 
llvm/include/llvm/Bitcode/BitstreamReader.h:1.4
--- llvm/include/llvm/Bitcode/BitstreamReader.h:1.3 Sun Apr 22 11:31:22 2007
+++ llvm/include/llvm/Bitcode/BitstreamReader.h Mon Apr 23 11:04:05 2007
@@ -16,9 +16,6 @@
 #define BITSTREAM_READER_H
 
 #include "llvm/Bitcode/BitCodes.h"
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/Support/DataTypes.h"
-#include 
 
 namespace llvm {
   


Index: llvm/include/llvm/Bitcode/BitstreamWriter.h
diff -u llvm/include/llvm/Bitcode/BitstreamWriter.h:1.2 
llvm/include/llvm/Bitcode/BitstreamWriter.h:1.3
--- llvm/include/llvm/Bitcode/BitstreamWriter.h:1.2 Sun Apr 22 10:00:52 2007
+++ llvm/include/llvm/Bitcode/BitstreamWriter.h Mon Apr 23 11:04:05 2007
@@ -16,9 +16,6 @@
 #define BITSTREAM_WRITER_H
 
 #include "llvm/Bitcode/BitCodes.h"
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/Support/DataTypes.h"
-#include 
 #include 
 
 namespace llvm {
@@ -39,11 +36,14 @@
   struct Block {
 unsigned PrevCodeSize;
 unsigned StartSizeWord;
+std::vector PrevAbb

[llvm-commits] CVS: llvm/lib/Bitcode/Reader/BitcodeReader.cpp

2007-04-23 Thread Chris Lattner


Changes in directory llvm/lib/Bitcode/Reader:

BitcodeReader.cpp updated: 1.1 -> 1.2
---
Log message:

first part of implementation of abbrevs.  The writer isn't fully there yet and 
the
reader doesn't handle them at all yet.


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

 BitcodeReader.cpp |   14 --
 1 files changed, 8 insertions(+), 6 deletions(-)


Index: llvm/lib/Bitcode/Reader/BitcodeReader.cpp
diff -u llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.1 
llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.2
--- llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.1   Sun Apr 22 01:23:29 2007
+++ llvm/lib/Bitcode/Reader/BitcodeReader.cpp   Mon Apr 23 11:04:05 2007
@@ -93,7 +93,7 @@
   continue;
 }
 
-if (Code == bitc::DEFINE_ABBREVS) {
+if (Code == bitc::DEFINE_ABBREV) {
   assert(0 && "Abbrevs not implemented yet!");
 }
 
@@ -230,7 +230,7 @@
   continue;
 }
 
-if (Code == bitc::DEFINE_ABBREVS) {
+if (Code == bitc::DEFINE_ABBREV) {
   assert(0 && "Abbrevs not implemented yet!");
 }
 
@@ -293,7 +293,7 @@
   continue;
 }
 
-if (Code == bitc::DEFINE_ABBREVS) {
+if (Code == bitc::DEFINE_ABBREV) {
   assert(0 && "Abbrevs not implemented yet!");
 }
 
@@ -345,7 +345,7 @@
 // GLOBALVAR: [type, isconst, initid, 
 // linkage, alignment, section, visibility, threadlocal]
 case bitc::MODULE_CODE_GLOBALVAR: {
-  if (Record.size() < 8)
+  if (Record.size() < 6)
 return Error("Invalid MODULE_CODE_GLOBALVAR record");
   const Type *Ty = getTypeByID(Record[0]);
   if (!isa(Ty))
@@ -361,8 +361,10 @@
   return Error("Invalid section ID");
 Section = SectionTable[Record[5]-1];
   }
-  GlobalValue::VisibilityTypes Visibility = 
GetDecodedVisibility(Record[6]);
-  bool isThreadLocal = Record[7];
+  GlobalValue::VisibilityTypes Visibility = GlobalValue::DefaultVisibility;
+  if (Record.size() >= 6) Visibility = GetDecodedVisibility(Record[6]);
+  bool isThreadLocal = false;
+  if (Record.size() >= 7) isThreadLocal = Record[7];
 
   GlobalVariable *NewGV =
 new GlobalVariable(Ty, isConstant, Linkage, 0, "", TheModule);



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


[llvm-commits] CVS: llvm-www/DevMtgMay2007.html

2007-04-23 Thread Chris Lattner


Changes in directory llvm-www:

DevMtgMay2007.html updated: 1.112 -> 1.113
---
Log message:

Add rafael


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

 DevMtgMay2007.html |5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)


Index: llvm-www/DevMtgMay2007.html
diff -u llvm-www/DevMtgMay2007.html:1.112 llvm-www/DevMtgMay2007.html:1.113
--- llvm-www/DevMtgMay2007.html:1.112   Thu Apr 19 00:20:43 2007
+++ llvm-www/DevMtgMay2007.html Mon Apr 23 11:58:07 2007
@@ -341,11 +341,12 @@
   
 Unconfirmed Attendees
 NameOrganization
+Rafael EspindolaGoogle
 Lang HamesUniversity of Sydney
 Michael McCrackenUCSD, Ph.D. Candidate
 Unconfirmed 1NASA, Ames
   
-  Total unconfirmed: 3
+  Total unconfirmed: 4
 
 
 
@@ -355,6 +356,6 @@
   src="http://jigsaw.w3.org/css-validator/images/vcss"; alt="Valid CSS!">
   http://validator.w3.org/check/referer";>http://www.w3.org/Icons/valid-html401"; alt="Valid HTML 4.01!">
-Last modified: $Date: 2007/04/19 05:20:43 $
+Last modified: $Date: 2007/04/23 16:58:07 $
 
 



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


[llvm-commits] CVS: llvm/include/llvm/Bitcode/BitstreamWriter.h

2007-04-23 Thread Chris Lattner


Changes in directory llvm/include/llvm/Bitcode:

BitstreamWriter.h updated: 1.3 -> 1.4
---
Log message:

finish implementation of basic abbrev writing.


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

 BitstreamWriter.h |   73 +++---
 1 files changed, 69 insertions(+), 4 deletions(-)


Index: llvm/include/llvm/Bitcode/BitstreamWriter.h
diff -u llvm/include/llvm/Bitcode/BitstreamWriter.h:1.3 
llvm/include/llvm/Bitcode/BitstreamWriter.h:1.4
--- llvm/include/llvm/Bitcode/BitstreamWriter.h:1.3 Mon Apr 23 11:04:05 2007
+++ llvm/include/llvm/Bitcode/BitstreamWriter.h Mon Apr 23 12:43:52 2007
@@ -194,11 +194,40 @@
   unsigned AbbrevNo = Abbrev-bitc::FIRST_ABBREV;
   assert(AbbrevNo < CurAbbrevs.size() && "Invalid abbrev #!");
   BitCodeAbbrev *Abbv = CurAbbrevs[AbbrevNo];
-  assert(0 && "TODO");
-  for (unsigned i = 0, e = Abbv->getNumOperandInfos(); i != e; ++i) {
-  }
   
+  EmitCode(Abbrev);
+  
+  // Insert the code into Vals to treat it uniformly.
+  Vals.insert(Vals.begin(), Code);
   
+  unsigned RecordIdx = 0;
+  for (unsigned i = 0, e = Abbv->getNumOperandInfos(); i != e; ++i) {
+assert(RecordIdx < Vals.size() && "Invalid abbrev/record");
+const BitCodeAbbrevOp &Op = Abbv->getOperandInfo(i);
+uint64_t RecordVal = Vals[RecordIdx];
+
+if (Op.isLiteral()) {
+  // If the abbrev specifies the literal value to use, don't emit
+  // anything.
+  assert(RecordVal == Op.getLiteralValue() &&
+ "Invalid abbrev for record!");
+  ++RecordIdx;
+} else {
+  // Encode the value as we are commanded.
+  switch (Op.getEncoding()) {
+  default: assert(0 && "Unknown encoding!");
+  case BitCodeAbbrevOp::FixedWidth:
+Emit64(RecordVal, Op.getEncodingData());
+++RecordIdx;
+break;
+  case BitCodeAbbrevOp::VBR:
+EmitVBR64(RecordVal, Op.getEncodingData());
+++RecordIdx;
+break;
+  }
+}
+  }
+  assert(RecordIdx == Vals.size() && "Not all record operands emitted!");
 } else {
   // If we don't have an abbrev to use, emit this in its fully 
unabbreviated
   // form.
@@ -215,7 +244,43 @@
   void EmitRecord(unsigned Code, SmallVectorImpl &Vals,
   unsigned Abbrev = 0) {
 if (Abbrev) {
-  assert(0 && "abbrevs not implemented yet!");
+  unsigned AbbrevNo = Abbrev-bitc::FIRST_ABBREV;
+  assert(AbbrevNo < CurAbbrevs.size() && "Invalid abbrev #!");
+  BitCodeAbbrev *Abbv = CurAbbrevs[AbbrevNo];
+  
+  EmitCode(Abbrev);
+
+  // Insert the code into Vals to treat it uniformly.
+  Vals.insert(Vals.begin(), Code);
+  
+  unsigned RecordIdx = 0;
+  for (unsigned i = 0, e = Abbv->getNumOperandInfos(); i != e; ++i) {
+assert(RecordIdx < Vals.size() && "Invalid abbrev/record");
+const BitCodeAbbrevOp &Op = Abbv->getOperandInfo(i);
+unsigned RecordVal = Vals[RecordIdx];
+
+if (Op.isLiteral()) {
+  // If the abbrev specifies the literal value to use, don't emit
+  // anything.
+  assert(RecordVal == Op.getLiteralValue() &&
+ "Invalid abbrev for record!");
+  ++RecordIdx;
+} else {
+  // Encode the value as we are commanded.
+  switch (Op.getEncoding()) {
+  default: assert(0 && "Unknown encoding!");
+  case BitCodeAbbrevOp::FixedWidth:
+Emit(RecordVal, Op.getEncodingData());
+++RecordIdx;
+break;
+  case BitCodeAbbrevOp::VBR:
+EmitVBR(RecordVal, Op.getEncodingData());
+++RecordIdx;
+break;
+  }
+}
+  }
+  assert(RecordIdx == Vals.size() && "Not all record operands emitted!");
 } else {
   // If we don't have an abbrev to use, emit this in its fully 
unabbreviated
   // form.



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


Re: [llvm-commits] CVS: llvm-www/Users.html

2007-04-23 Thread Bill Wendling
Hi John,

> +http://www.abo.fi/";>Åbo Akademi University

Could you use the HTML entity for the "Å"? I think it's "Â".

Thanks!
-bw

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


[llvm-commits] CVS: llvm/include/llvm/Bitcode/BitstreamWriter.h

2007-04-23 Thread Chris Lattner


Changes in directory llvm/include/llvm/Bitcode:

BitstreamWriter.h updated: 1.4 -> 1.5
---
Log message:

minor cleanups


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

 BitstreamWriter.h |8 +---
 1 files changed, 5 insertions(+), 3 deletions(-)


Index: llvm/include/llvm/Bitcode/BitstreamWriter.h
diff -u llvm/include/llvm/Bitcode/BitstreamWriter.h:1.4 
llvm/include/llvm/Bitcode/BitstreamWriter.h:1.5
--- llvm/include/llvm/Bitcode/BitstreamWriter.h:1.4 Mon Apr 23 12:43:52 2007
+++ llvm/include/llvm/Bitcode/BitstreamWriter.h Mon Apr 23 13:57:32 2007
@@ -32,7 +32,10 @@
   // CurCodeSize - This is the declared size of code values used for the 
current
   // block, in bits.
   unsigned CurCodeSize;
-  
+
+  /// CurAbbrevs - Abbrevs installed at in this block.
+  std::vector CurAbbrevs;
+
   struct Block {
 unsigned PrevCodeSize;
 unsigned StartSizeWord;
@@ -43,14 +46,13 @@
   /// BlockScope - This tracks the current blocks that we have entered.
   std::vector BlockScope;
   
-  std::vector CurAbbrevs;
 public:
   BitstreamWriter(std::vector &O) 
 : Out(O), CurBit(0), CurValue(0), CurCodeSize(2) {}
 
   ~BitstreamWriter() {
 assert(CurBit == 0 && "Unflused data remaining");
-assert(BlockScope.empty() && "Block imbalance");
+assert(BlockScope.empty() && CurAbbrevs.empty() && "Block imbalance");
   }
   
//======//
   // Basic Primitives for emitting bits to the stream.



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


[llvm-commits] CVS: llvm/include/llvm/Bitcode/BitstreamReader.h

2007-04-23 Thread Chris Lattner


Changes in directory llvm/include/llvm/Bitcode:

BitstreamReader.h updated: 1.4 -> 1.5
---
Log message:

implement reading of abbrevs


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

 BitstreamReader.h |   95 ++
 1 files changed, 89 insertions(+), 6 deletions(-)


Index: llvm/include/llvm/Bitcode/BitstreamReader.h
diff -u llvm/include/llvm/Bitcode/BitstreamReader.h:1.4 
llvm/include/llvm/Bitcode/BitstreamReader.h:1.5
--- llvm/include/llvm/Bitcode/BitstreamReader.h:1.4 Mon Apr 23 11:04:05 2007
+++ llvm/include/llvm/Bitcode/BitstreamReader.h Mon Apr 23 13:57:58 2007
@@ -34,10 +34,19 @@
   // CurCodeSize - This is the declared size of code values used for the 
current
   // block, in bits.
   unsigned CurCodeSize;
+
+  /// CurAbbrevs - Abbrevs installed at in this block.
+  std::vector CurAbbrevs;
   
-  /// BlockScope - This tracks the codesize of parent blocks.
-  SmallVector BlockScope;
+  struct Block {
+unsigned PrevCodeSize;
+std::vector PrevAbbrevs;
+explicit Block(unsigned PCS) : PrevCodeSize(PCS) {}
+  };
   
+  /// BlockScope - This tracks the codesize of parent blocks.
+  SmallVector BlockScope;
+
 public:
   BitstreamReader(const unsigned char *Start, const unsigned char *End)
 : NextChar(Start), LastChar(End) {
@@ -47,6 +56,19 @@
 CurCodeSize = 2;
   }
   
+  ~BitstreamReader() {
+// Abbrevs could still exist if the stream was broken.  If so, don't leak
+// them.
+for (unsigned i = 0, e = CurAbbrevs.size(); i != e; ++i)
+  delete CurAbbrevs[i];
+
+for (unsigned S = 0, e = BlockScope.size(); S != e; ++S) {
+  std::vector &Abbrevs = BlockScope[S].PrevAbbrevs;
+  for (unsigned i = 0, e = Abbrevs.size(); i != e; ++i)
+delete Abbrevs[i];
+}
+  }
+  
   bool AtEndOfStream() const { return NextChar == LastChar; }
   
   uint32_t Read(unsigned NumBits) {
@@ -87,6 +109,13 @@
 return R;
   }
   
+  uint64_t Read64(unsigned NumBits) {
+if (NumBits <= 32) return Read(NumBits);
+
+uint64_t V = Read(32);
+return V | (uint64_t)Read(NumBits-32) << 32;
+  }
+  
   uint32_t ReadVBR(unsigned NumBits) {
 uint32_t Piece = Read(NumBits);
 if ((Piece & (1U << (NumBits-1))) == 0)
@@ -168,7 +197,8 @@
   /// EnterSubBlock - Having read the ENTER_SUBBLOCK abbrevid, read and enter
   /// the block, returning the BlockID of the block we just entered.
   bool EnterSubBlock() {
-BlockScope.push_back(CurCodeSize);
+BlockScope.push_back(Block(CurCodeSize));
+BlockScope.back().PrevAbbrevs.swap(CurAbbrevs);
 
 // Get the codesize of this block.
 CurCodeSize = ReadVBR(bitc::CodeLenWidth);
@@ -188,7 +218,13 @@
 // Block tail:
 //[END_BLOCK, ]
 SkipToWord();
-CurCodeSize = BlockScope.back();
+CurCodeSize = BlockScope.back().PrevCodeSize;
+
+// Delete abbrevs from popped scope.
+for (unsigned i = 0, e = CurAbbrevs.size(); i != e; ++i)
+  delete CurAbbrevs[i];
+
+BlockScope.back().PrevAbbrevs.swap(CurAbbrevs);
 BlockScope.pop_back();
 return false;
   }
@@ -206,10 +242,57 @@
   return Code;
 }
 
-assert(0 && "Reading with abbrevs not implemented!");
-return 0;
+unsigned AbbrevNo = AbbrevID-bitc::FIRST_ABBREV;
+assert(AbbrevNo < CurAbbrevs.size() && "Invalid abbrev #!");
+BitCodeAbbrev *Abbv = CurAbbrevs[AbbrevNo];
+
+for (unsigned i = 0, e = Abbv->getNumOperandInfos(); i != e; ++i) {
+  const BitCodeAbbrevOp &Op = Abbv->getOperandInfo(i);
+  if (Op.isLiteral()) {
+// If the abbrev specifies the literal value to use, use it.
+Vals.push_back(Op.getLiteralValue());
+  } else {
+// Decode the value as we are commanded.
+switch (Op.getEncoding()) {
+default: assert(0 && "Unknown encoding!");
+case BitCodeAbbrevOp::FixedWidth:
+  Vals.push_back(Read(Op.getEncodingData()));
+  break;
+case BitCodeAbbrevOp::VBR:
+  Vals.push_back(ReadVBR64(Op.getEncodingData()));
+  break;
+}
+  }
+}
+
+unsigned Code = Vals[0];
+Vals.erase(Vals.begin());
+return Code;
   }
   
+  
//======//
+  // Abbrev Processing
+  
//======//
+  
+  void ReadAbbrevRecord() {
+BitCodeAbbrev *Abbv = new BitCodeAbbrev();
+unsigned NumOpInfo = ReadVBR(5);
+for (unsigned i = 0; i != NumOpInfo; ++i) {
+  bool IsLiteral = Read(1);
+  if (IsLiteral) {
+Abbv->Add(BitCodeAbbrevOp(ReadVBR64(8)));
+continue;
+  }
+
+  BitCodeAbbrevOp::Encoding E = (BitCodeAbbrevOp::Encoding)Read(3);
+  if (BitCodeAbbrevOp::hasEncodingData(E)) {
+Abbv->Add(BitCodeAbbrevOp(E, ReadVBR64(5)));
+  } else {
+assert(0 && "unimp");
+  }
+}
+CurAbbrevs.push_back(Abbv);
+  }
 };
 
 } // End llvm namespace



__

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

2007-04-23 Thread Chris Lattner


Changes in directory llvm/lib/Bitcode/Writer:

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

implement reading of abbrevs, and writing of abbreviated global varrs.


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

 Writer.cpp |   10 +++---
 1 files changed, 7 insertions(+), 3 deletions(-)


Index: llvm/lib/Bitcode/Writer/Writer.cpp
diff -u llvm/lib/Bitcode/Writer/Writer.cpp:1.3 
llvm/lib/Bitcode/Writer/Writer.cpp:1.4
--- llvm/lib/Bitcode/Writer/Writer.cpp:1.3  Mon Apr 23 11:04:05 2007
+++ llvm/lib/Bitcode/Writer/Writer.cpp  Mon Apr 23 13:58:34 2007
@@ -204,9 +204,11 @@
   // compute the maximum alignment value.
   std::map SectionMap;
   unsigned MaxAlignment = 0;
+  unsigned MaxGlobalType = 0;
   for (Module::const_global_iterator GV = M->global_begin(),E = 
M->global_end();
GV != E; ++GV) {
 MaxAlignment = std::max(MaxAlignment, GV->getAlignment());
+MaxGlobalType = std::max(MaxGlobalType, VE.getTypeID(GV->getType()));
 
 if (!GV->hasSection()) continue;
 // Give section names unique ID's.
@@ -229,10 +231,12 @@
   
   // Emit abbrev for globals, now that we know # sections and max alignment.
   unsigned SimpleGVarAbbrev = 0;
-  if (!M->global_empty() && 0) { 
+  if (!M->global_empty()) { 
 // Add an abbrev for common globals with no visibility or thread localness.
 BitCodeAbbrev *Abbv = new BitCodeAbbrev();
 Abbv->Add(BitCodeAbbrevOp(bitc::MODULE_CODE_GLOBALVAR));
+Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::FixedWidth,
+  Log2_32_Ceil(MaxGlobalType+1)));
 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::FixedWidth, 1)); // Constant.
 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));// Initializer.
 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::FixedWidth, 3)); // Linkage.
@@ -241,7 +245,7 @@
 else {
   unsigned MaxEncAlignment = Log2_32(MaxAlignment)+1;
   Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::FixedWidth,
-   Log2_32_Ceil(MaxEncAlignment)));
+   Log2_32_Ceil(MaxEncAlignment+1)));
 }
 if (SectionMap.empty())// Section.
   Abbv->Add(BitCodeAbbrevOp(0));
@@ -300,7 +304,7 @@
 
 /// WriteModule - Emit the specified module to the bitstream.
 static void WriteModule(const Module *M, BitstreamWriter &Stream) {
-  Stream.EnterSubblock(bitc::MODULE_BLOCK_ID, 2);
+  Stream.EnterSubblock(bitc::MODULE_BLOCK_ID, 3);
   
   // Emit the version number if it is non-zero.
   if (CurVersion) {



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


[llvm-commits] CVS: llvm/lib/Bitcode/Reader/BitcodeReader.cpp

2007-04-23 Thread Chris Lattner


Changes in directory llvm/lib/Bitcode/Reader:

BitcodeReader.cpp updated: 1.2 -> 1.3
---
Log message:

implement reading of abbrevs, and writing of abbreviated global varrs.


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

 BitcodeReader.cpp |9 ++---
 1 files changed, 6 insertions(+), 3 deletions(-)


Index: llvm/lib/Bitcode/Reader/BitcodeReader.cpp
diff -u llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.2 
llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.3
--- llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.2   Mon Apr 23 11:04:05 2007
+++ llvm/lib/Bitcode/Reader/BitcodeReader.cpp   Mon Apr 23 13:58:34 2007
@@ -94,7 +94,8 @@
 }
 
 if (Code == bitc::DEFINE_ABBREV) {
-  assert(0 && "Abbrevs not implemented yet!");
+  Stream.ReadAbbrevRecord();
+  continue;
 }
 
 // Read a record.
@@ -231,7 +232,8 @@
 }
 
 if (Code == bitc::DEFINE_ABBREV) {
-  assert(0 && "Abbrevs not implemented yet!");
+  Stream.ReadAbbrevRecord();
+  continue;
 }
 
 // Read a record.
@@ -294,7 +296,8 @@
 }
 
 if (Code == bitc::DEFINE_ABBREV) {
-  assert(0 && "Abbrevs not implemented yet!");
+  Stream.ReadAbbrevRecord();
+  continue;
 }
 
 // Read a record.



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


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

2007-04-23 Thread Dale Johannesen


Changes in directory llvm/lib/CodeGen:

AsmPrinter.cpp updated: 1.154 -> 1.155
---
Log message:

make EmitAlignment work the way Chris says it should


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

 AsmPrinter.cpp |4 +++-
 1 files changed, 3 insertions(+), 1 deletion(-)


Index: llvm/lib/CodeGen/AsmPrinter.cpp
diff -u llvm/lib/CodeGen/AsmPrinter.cpp:1.154 
llvm/lib/CodeGen/AsmPrinter.cpp:1.155
--- llvm/lib/CodeGen/AsmPrinter.cpp:1.154   Tue Mar  6 13:25:02 2007
+++ llvm/lib/CodeGen/AsmPrinter.cpp Mon Apr 23 14:58:54 2007
@@ -579,8 +579,10 @@
 
//===--===//
 
 // EmitAlignment - Emit an alignment directive to the specified power of two.
+// Use the maximum of the specified alignment and the alignment from the
+// specified GlobalValue (if any).
 void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV) const {
-  if (GV && GV->getAlignment())
+  if (GV && GV->getAlignment() && Log2_32(GV->getAlignment()) > NumBits)
 NumBits = Log2_32(GV->getAlignment());
   if (NumBits == 0) return;   // No need to emit alignment.
   if (TAI->getAlignmentIsInBytes()) NumBits = 1 << NumBits;



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


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

2007-04-23 Thread Dale Johannesen


Changes in directory llvm/lib/Target:

TargetAsmInfo.cpp updated: 1.22 -> 1.23
---
Log message:

Fix generic getInlineAsmLength


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

 TargetAsmInfo.cpp |   22 ++
 1 files changed, 18 insertions(+), 4 deletions(-)


Index: llvm/lib/Target/TargetAsmInfo.cpp
diff -u llvm/lib/Target/TargetAsmInfo.cpp:1.22 
llvm/lib/Target/TargetAsmInfo.cpp:1.23
--- llvm/lib/Target/TargetAsmInfo.cpp:1.22  Fri Apr 20 16:38:10 2007
+++ llvm/lib/Target/TargetAsmInfo.cpp   Mon Apr 23 15:00:17 2007
@@ -13,6 +13,8 @@
 
//===--===//
 
 #include "llvm/Target/TargetAsmInfo.h"
+#include 
+#include 
 
 using namespace llvm;
 
@@ -100,15 +102,27 @@
 
 /// Measure the specified inline asm to determine an approximation of its
 /// length.
+/// Comments (which run till the next SeparatorChar or newline) do not
+/// count as an instruction.
+/// Any other non-whitespace text is considered an instruction, with
+/// multiple instructions separated by SeparatorChar or newlines.
+/// Variable-length instructions are not handled here; this function
+/// may be overloaded in the target code to do that.
 unsigned TargetAsmInfo::getInlineAsmLength(const char *Str) const {
   // Count the number of instructions in the asm.
-  unsigned NumInsts = 0;
+  bool atInsnStart = true;
+  unsigned Length = 0;
   for (; *Str; ++Str) {
 if (*Str == '\n' || *Str == SeparatorChar)
-  ++NumInsts;
+  atInsnStart = true;
+if (atInsnStart && !isspace(*Str)) {
+  Length += MaxInstLength;
+  atInsnStart = false;
+}
+if (atInsnStart && strncmp(Str, CommentString, strlen(CommentString))==0)
+  atInsnStart = false;
   }
 
-  // Multiply by the worst-case length for each instruction.
-  return NumInsts * MaxInstLength;
+  return Length;
 }
 



___
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/ARMTargetAsmInfo.cpp ARMTargetAsmInfo.h

2007-04-23 Thread Dale Johannesen


Changes in directory llvm/lib/Target/ARM:

ARMTargetAsmInfo.cpp updated: 1.13 -> 1.14
ARMTargetAsmInfo.h updated: 1.1 -> 1.2
---
Log message:

add isThumb (unused as yet)


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

 ARMTargetAsmInfo.cpp |3 +++
 ARMTargetAsmInfo.h   |2 ++
 2 files changed, 5 insertions(+)


Index: llvm/lib/Target/ARM/ARMTargetAsmInfo.cpp
diff -u llvm/lib/Target/ARM/ARMTargetAsmInfo.cpp:1.13 
llvm/lib/Target/ARM/ARMTargetAsmInfo.cpp:1.14
--- llvm/lib/Target/ARM/ARMTargetAsmInfo.cpp:1.13   Wed Mar  7 19:25:25 2007
+++ llvm/lib/Target/ARM/ARMTargetAsmInfo.cppMon Apr 23 15:04:35 2007
@@ -13,6 +13,8 @@
 
 #include "ARMTargetAsmInfo.h"
 #include "ARMTargetMachine.h"
+#include 
+#include 
 using namespace llvm;
 
 ARMTargetAsmInfo::ARMTargetAsmInfo(const ARMTargetMachine &TM) {
@@ -80,4 +82,5 @@
   InlineAsmStart = "@ InlineAsm Start";
   InlineAsmEnd = "@ InlineAsm End";
   LCOMMDirective = "\t.lcomm\t";
+  isThumb = Subtarget->isThumb();
 }


Index: llvm/lib/Target/ARM/ARMTargetAsmInfo.h
diff -u llvm/lib/Target/ARM/ARMTargetAsmInfo.h:1.1 
llvm/lib/Target/ARM/ARMTargetAsmInfo.h:1.2
--- llvm/lib/Target/ARM/ARMTargetAsmInfo.h:1.1  Thu Sep  7 17:05:01 2006
+++ llvm/lib/Target/ARM/ARMTargetAsmInfo.h  Mon Apr 23 15:04:35 2007
@@ -23,6 +23,8 @@
 
   struct ARMTargetAsmInfo : public TargetAsmInfo {
 ARMTargetAsmInfo(const ARMTargetMachine &TM);
+
+bool isThumb;
   };
 
 



___
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/ARMMachineFunctionInfo.h ARMAsmPrinter.cpp

2007-04-23 Thread Dale Johannesen


Changes in directory llvm/lib/Target/ARM:

ARMMachineFunctionInfo.h updated: 1.8 -> 1.9
ARMAsmPrinter.cpp updated: 1.65 -> 1.66
---
Log message:

add Align field, and use when generating function alignment


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

 ARMAsmPrinter.cpp|2 +-
 ARMMachineFunctionInfo.h |   14 --
 2 files changed, 13 insertions(+), 3 deletions(-)


Index: llvm/lib/Target/ARM/ARMMachineFunctionInfo.h
diff -u llvm/lib/Target/ARM/ARMMachineFunctionInfo.h:1.8 
llvm/lib/Target/ARM/ARMMachineFunctionInfo.h:1.9
--- llvm/lib/Target/ARM/ARMMachineFunctionInfo.h:1.8Thu Mar  1 02:26:31 2007
+++ llvm/lib/Target/ARM/ARMMachineFunctionInfo.hMon Apr 23 15:07:25 2007
@@ -27,9 +27,14 @@
 class ARMFunctionInfo : public MachineFunctionInfo {
 
   /// isThumb - True if this function is compiled under Thumb mode.
-  ///
+  /// Used to initialized Align, so must precede it.
   bool isThumb;
 
+  /// Align - required alignment.  ARM functions and Thumb functions with
+  /// constant pools require 4-byte alignment; other Thumb functions
+  /// require only 2-byte alignment.
+  unsigned Align;
+
   /// VarArgsRegSaveSize - Size of the register save area for vararg functions.
   ///
   unsigned VarArgsRegSaveSize;
@@ -84,7 +89,8 @@
 
 public:
   ARMFunctionInfo() :
-isThumb(false),
+isThumb(false), 
+Align(2U),
 VarArgsRegSaveSize(0), HasStackFrame(false),
 LRSpilledForFarJump(false), R3IsLiveIn(false),
 FramePtrSpillOffset(0), GPRCS1Offset(0), GPRCS2Offset(0), DPRCSOffset(0),
@@ -94,6 +100,7 @@
 
   ARMFunctionInfo(MachineFunction &MF) :
 isThumb(MF.getTarget().getSubtarget().isThumb()),
+Align(isThumb ? 1U : 2U),
 VarArgsRegSaveSize(0), HasStackFrame(false),
 LRSpilledForFarJump(false), R3IsLiveIn(false),
 FramePtrSpillOffset(0), GPRCS1Offset(0), GPRCS2Offset(0), DPRCSOffset(0),
@@ -104,6 +111,9 @@
 
   bool isThumbFunction() const { return isThumb; }
 
+  unsigned getAlign() const { return Align; }
+  void setAlign(unsigned a) { Align = a; }
+
   unsigned getVarArgsRegSaveSize() const { return VarArgsRegSaveSize; }
   void setVarArgsRegSaveSize(unsigned s) { VarArgsRegSaveSize = s; }
 


Index: llvm/lib/Target/ARM/ARMAsmPrinter.cpp
diff -u llvm/lib/Target/ARM/ARMAsmPrinter.cpp:1.65 
llvm/lib/Target/ARM/ARMAsmPrinter.cpp:1.66
--- llvm/lib/Target/ARM/ARMAsmPrinter.cpp:1.65  Sat Apr 21 19:04:12 2007
+++ llvm/lib/Target/ARM/ARMAsmPrinter.cpp   Mon Apr 23 15:07:25 2007
@@ -211,7 +211,7 @@
   O << Directive << CurrentFnName << "\n";
 
   if (AFI->isThumbFunction()) {
-EmitAlignment(1, F);
+EmitAlignment(AFI->getAlign(), F);
 O << "\t.code\t16\n";
 O << "\t.thumb_func";
 if (Subtarget->isTargetDarwin())



___
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-04-23 Thread Dale Johannesen


Changes in directory llvm/lib/Target/ARM:

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

Make Thumb funcs containing islands 4-byte aligned.  Fix bugs maintaining
BBOffsets and BBSizes when adjusting conditional branches.


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

 ARMConstantIslandPass.cpp |   25 +++--
 1 files changed, 19 insertions(+), 6 deletions(-)


Index: llvm/lib/Target/ARM/ARMConstantIslandPass.cpp
diff -u llvm/lib/Target/ARM/ARMConstantIslandPass.cpp:1.35 
llvm/lib/Target/ARM/ARMConstantIslandPass.cpp:1.36
--- llvm/lib/Target/ARM/ARMConstantIslandPass.cpp:1.35  Tue Apr  3 18:39:48 2007
+++ llvm/lib/Target/ARM/ARMConstantIslandPass.cpp   Mon Apr 23 15:09:04 2007
@@ -121,7 +121,6 @@
 bool HasFarJump;
 
 const TargetInstrInfo *TII;
-const ARMFunctionInfo *AFI;
 bool isThumb;
   public:
 virtual bool runOnMachineFunction(MachineFunction &Fn);
@@ -173,9 +172,9 @@
 
 bool ARMConstantIslands::runOnMachineFunction(MachineFunction &Fn) {
   MachineConstantPool &MCP = *Fn.getConstantPool();
+  ARMFunctionInfo *AFI = Fn.getInfo();
   
   TII = Fn.getTarget().getInstrInfo();
-  AFI = Fn.getInfo();
   isThumb = AFI->isThumbFunction();
 
   HasFarJump = false;
@@ -184,11 +183,18 @@
   // the numbers agree with the position of the block in the function.
   Fn.RenumberBlocks();
 
+  /// Thumb functions containing constant pools get 2-byte alignment.  This is 
so
+  /// we can keep exact track of where the alignment padding goes.  Set 
default.
+  AFI->setAlign(isThumb ? 1U : 2U);
+
   // Perform the initial placement of the constant pool entries.  To start 
with,
   // we put them all at the end of the function.
   std::vector CPEMIs;
-  if (!MCP.isEmpty())
+  if (!MCP.isEmpty()) {
 DoInitialPlacement(Fn, CPEMIs);
+if (isThumb)
+  AFI->setAlign(2U);
+  }
   
   /// The next UID to take is the first unused one.
   NextUID = CPEMIs.size();
@@ -1071,6 +1077,9 @@
 SplitBlockBeforeInstr(MI);
 // No need for the branch to the next block. We're adding a unconditional
 // branch to the destination.
+int delta = ARM::GetInstSize(&MBB->back());
+BBSizes[MBB->getNumber()] -= delta;
+AdjustBBOffsetsAfter(MBB, -delta);
 MBB->back().eraseFromParent();
   }
   MachineBasicBlock *NextBB = next(MachineFunction::iterator(MBB));
@@ -1079,18 +1088,22 @@
<< " also invert condition and change dest. to BB#"
<< NextBB->getNumber() << "\n";
 
-  // Insert a unconditional branch and replace the conditional branch.
+  // Insert a new conditional branch and a new unconditional branch.
   // Also update the ImmBranch as well as adding a new entry for the new 
branch.
   BuildMI(MBB, TII->get(MI->getOpcode())).addMBB(NextBB).addImm(CC);
   Br.MI = &MBB->back();
+  BBSizes[MBB->getNumber()] += ARM::GetInstSize(&MBB->back());
   BuildMI(MBB, TII->get(Br.UncondBr)).addMBB(DestBB);
+  BBSizes[MBB->getNumber()] += ARM::GetInstSize(&MBB->back());
   unsigned MaxDisp = getUnconditionalBrDisp(Br.UncondBr);
   ImmBranches.push_back(ImmBranch(&MBB->back(), MaxDisp, false, Br.UncondBr));
+
+  // Remove the old conditional branch.  It may or may not still be in MBB.
+  BBSizes[MI->getParent()->getNumber()] -= ARM::GetInstSize(MI);
   MI->eraseFromParent();
 
-  // Increase the size of MBB to account for the new unconditional branch.
+  // The net size change is an addition of one unconditional branch.
   int delta = ARM::GetInstSize(&MBB->back());
-  BBSizes[MBB->getNumber()] += delta;
   AdjustBBOffsetsAfter(MBB, delta);
   return true;
 }



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


[llvm-commits] CVS: llvm/include/llvm/Bitcode/BitstreamWriter.h LLVMBitCodes.h

2007-04-23 Thread Chris Lattner


Changes in directory llvm/include/llvm/Bitcode:

BitstreamWriter.h updated: 1.5 -> 1.6
LLVMBitCodes.h updated: 1.1 -> 1.2
---
Log message:

Fix a bug in bitstream writer handling abbrevs, add value symtab


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

 BitstreamWriter.h |   11 ++-
 LLVMBitCodes.h|7 ++-
 2 files changed, 12 insertions(+), 6 deletions(-)


Index: llvm/include/llvm/Bitcode/BitstreamWriter.h
diff -u llvm/include/llvm/Bitcode/BitstreamWriter.h:1.5 
llvm/include/llvm/Bitcode/BitstreamWriter.h:1.6
--- llvm/include/llvm/Bitcode/BitstreamWriter.h:1.5 Mon Apr 23 13:57:32 2007
+++ llvm/include/llvm/Bitcode/BitstreamWriter.h Mon Apr 23 15:34:46 2007
@@ -147,12 +147,8 @@
 EmitVBR(CodeLen, bitc::CodeLenWidth);
 FlushToWord();
 BlockScope.push_back(Block(CurCodeSize, Out.size()/4));
-
-// Delete all abbrevs.
-for (unsigned i = 0, e = CurAbbrevs.size(); i != e; ++i)
-  delete CurAbbrevs[i];
-
 BlockScope.back().PrevAbbrevs.swap(CurAbbrevs);
+
 // Emit a placeholder, which will be replaced when the block is popped.
 Emit(0, bitc::BlockSizeWidth);
 
@@ -161,6 +157,11 @@
   
   void ExitBlock() {
 assert(!BlockScope.empty() && "Block scope imbalance!");
+
+// Delete all abbrevs.
+for (unsigned i = 0, e = CurAbbrevs.size(); i != e; ++i)
+  delete CurAbbrevs[i];
+
 const Block &B = BlockScope.back();
 
 // Block tail:


Index: llvm/include/llvm/Bitcode/LLVMBitCodes.h
diff -u llvm/include/llvm/Bitcode/LLVMBitCodes.h:1.1 
llvm/include/llvm/Bitcode/LLVMBitCodes.h:1.2
--- llvm/include/llvm/Bitcode/LLVMBitCodes.h:1.1Sun Apr 22 20:01:15 2007
+++ llvm/include/llvm/Bitcode/LLVMBitCodes.hMon Apr 23 15:34:46 2007
@@ -33,7 +33,7 @@
 GLOBALCONSTANTS_BLOCK_ID = 3,
 FUNCTION_BLOCK_ID= 4,
 TYPE_SYMTAB_BLOCK_ID = 5,
-GLOBAL_SYMTAB_BLOCK_ID   = 6
+VALUE_SYMTAB_BLOCK_ID= 6
   };
   
   
@@ -81,6 +81,11 @@
 TST_ENTRY_CODE = 1 // TST_ENTRY: [typeid, namelen, namechar x N]
   };
   
+  // The value symbol table only has one code (VST_ENTRY_CODE).
+  enum ValueSymtabCodes {
+VST_ENTRY_CODE = 1 // VST_ENTRY: [valid, namelen, namechar x N]
+  };
+  
 } // End bitc namespace
 } // End llvm namespace
 



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


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

2007-04-23 Thread Chris Lattner


Changes in directory llvm/lib/Bitcode/Writer:

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

write out the symtab for globals.


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

 Writer.cpp |  103 +
 1 files changed, 70 insertions(+), 33 deletions(-)


Index: llvm/lib/Bitcode/Writer/Writer.cpp
diff -u llvm/lib/Bitcode/Writer/Writer.cpp:1.4 
llvm/lib/Bitcode/Writer/Writer.cpp:1.5
--- llvm/lib/Bitcode/Writer/Writer.cpp:1.4  Mon Apr 23 13:58:34 2007
+++ llvm/lib/Bitcode/Writer/Writer.cpp  Mon Apr 23 15:35:01 2007
@@ -18,6 +18,7 @@
 #include "llvm/DerivedTypes.h"
 #include "llvm/Module.h"
 #include "llvm/TypeSymbolTable.h"
+#include "llvm/ValueSymbolTable.h"
 #include "llvm/Support/MathExtras.h"
 using namespace llvm;
 
@@ -126,39 +127,6 @@
   Stream.ExitBlock();
 }
 
-/// WriteTypeSymbolTable - Emit a block for the specified type symtab.
-static void WriteTypeSymbolTable(const TypeSymbolTable &TST,
- const ValueEnumerator &VE,
- BitstreamWriter &Stream) {
-  if (TST.empty()) return;
-
-  Stream.EnterSubblock(bitc::TYPE_SYMTAB_BLOCK_ID, 3);
-
-  // FIXME: Set up the abbrev, we know how many types there are!
-  // FIXME: We know if the type names can use 7-bit ascii.
-  
-  SmallVector NameVals;
-
-  for (TypeSymbolTable::const_iterator TI = TST.begin(), TE = TST.end(); 
-   TI != TE; ++TI) {
-unsigned AbbrevToUse = 0;
-
-// TST_ENTRY: [typeid, namelen, namechar x N]
-NameVals.push_back(VE.getTypeID(TI->second));
-
-const std::string &Str = TI->first;
-NameVals.push_back(Str.size());
-for (unsigned i = 0, e = Str.size(); i != e; ++i)
-  NameVals.push_back(Str[i]);
-  
-// Emit the finished record.
-Stream.EmitRecord(bitc::TST_ENTRY_CODE, NameVals, AbbrevToUse);
-NameVals.clear();
-  }
-
-  Stream.ExitBlock();
-}
-
 static unsigned getEncodedLinkage(const GlobalValue *GV) {
   switch (GV->getLinkage()) {
   default: assert(0 && "Invalid linkage!");
@@ -302,6 +270,71 @@
 }
 
 
+/// WriteTypeSymbolTable - Emit a block for the specified type symtab.
+static void WriteTypeSymbolTable(const TypeSymbolTable &TST,
+ const ValueEnumerator &VE,
+ BitstreamWriter &Stream) {
+  if (TST.empty()) return;
+  
+  Stream.EnterSubblock(bitc::TYPE_SYMTAB_BLOCK_ID, 3);
+  
+  // FIXME: Set up the abbrev, we know how many types there are!
+  // FIXME: We know if the type names can use 7-bit ascii.
+  
+  SmallVector NameVals;
+  
+  for (TypeSymbolTable::const_iterator TI = TST.begin(), TE = TST.end(); 
+   TI != TE; ++TI) {
+unsigned AbbrevToUse = 0;
+
+// TST_ENTRY: [typeid, namelen, namechar x N]
+NameVals.push_back(VE.getTypeID(TI->second));
+
+const std::string &Str = TI->first;
+NameVals.push_back(Str.size());
+for (unsigned i = 0, e = Str.size(); i != e; ++i)
+  NameVals.push_back(Str[i]);
+
+// Emit the finished record.
+Stream.EmitRecord(bitc::TST_ENTRY_CODE, NameVals, AbbrevToUse);
+NameVals.clear();
+  }
+  
+  Stream.ExitBlock();
+}
+
+// Emit names for globals/functions etc.
+static void WriteValueSymbolTable(const ValueSymbolTable &VST,
+  const ValueEnumerator &VE,
+  BitstreamWriter &Stream) {
+  if (VST.empty()) return;
+  Stream.EnterSubblock(bitc::VALUE_SYMTAB_BLOCK_ID, 3);
+
+  // FIXME: Set up the abbrev, we know how many values there are!
+  // FIXME: We know if the type names can use 7-bit ascii.
+  SmallVector NameVals;
+
+  for (ValueSymbolTable::const_iterator SI = VST.begin(), SE = VST.end();
+   SI != SE; ++SI) {
+unsigned AbbrevToUse = 0;
+
+// VST_ENTRY: [valueid, namelen, namechar x N]
+NameVals.push_back(VE.getValueID(SI->getValue()));
+  
+NameVals.push_back(SI->getKeyLength());
+for (const char *P = SI->getKeyData(),
+ *E = SI->getKeyData()+SI->getKeyLength(); P != E; ++P)
+  NameVals.push_back((unsigned char)*P);
+
+// Emit the finished record.
+Stream.EmitRecord(bitc::VST_ENTRY_CODE, NameVals, AbbrevToUse);
+NameVals.clear();
+  }
+  Stream.ExitBlock();
+}
+
+
+
 /// WriteModule - Emit the specified module to the bitstream.
 static void WriteModule(const Module *M, BitstreamWriter &Stream) {
   Stream.EnterSubblock(bitc::MODULE_BLOCK_ID, 3);
@@ -327,6 +360,10 @@
   
   // Emit the type symbol table information.
   WriteTypeSymbolTable(M->getTypeSymbolTable(), VE, Stream);
+  
+  // Emit names for globals/functions etc.
+  WriteValueSymbolTable(M->getValueSymbolTable(), VE, Stream);
+  
   Stream.ExitBlock();
 }
 



___
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/SmallString.h

2007-04-23 Thread Chris Lattner


Changes in directory llvm/include/llvm/ADT:

SmallString.h updated: 1.1 -> 1.2
---
Log message:

add a missing operator


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

 SmallString.h |5 +
 1 files changed, 5 insertions(+)


Index: llvm/include/llvm/ADT/SmallString.h
diff -u llvm/include/llvm/ADT/SmallString.h:1.1 
llvm/include/llvm/ADT/SmallString.h:1.2
--- llvm/include/llvm/ADT/SmallString.h:1.1 Sun Oct 29 21:39:20 2006
+++ llvm/include/llvm/ADT/SmallString.h Mon Apr 23 15:58:14 2007
@@ -49,6 +49,11 @@
 this->append(RHS, RHS+strlen(RHS));
 return *this;
   }
+  SmallString &operator+=(char C) {
+this->push_back(C);
+return *this;
+  }
+  
 };
   
   



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


[llvm-commits] CVS: llvm/test/lib/llvm.exp

2007-04-23 Thread Reid Spencer


Changes in directory llvm/test/lib:

llvm.exp updated: 1.22 -> 1.23
---
Log message:

Dan is right, using "string first" would produce false positives. So,
devolve the check to a comparison against each component in the string. 
Fortunately there isn't many of them.


---
Diffs of the changes:  (+9 -7)

 llvm.exp |   16 +---
 1 files changed, 9 insertions(+), 7 deletions(-)


Index: llvm/test/lib/llvm.exp
diff -u llvm/test/lib/llvm.exp:1.22 llvm/test/lib/llvm.exp:1.23
--- llvm/test/lib/llvm.exp:1.22 Sun Apr 22 09:14:11 2007
+++ llvm/test/lib/llvm.exp  Mon Apr 23 16:21:53 2007
@@ -207,13 +207,15 @@
 fortran { set file fcc1 }
 default { return 0 }
   }
-  if { [ string first "$lang" "$llvmgcc_langs" ] >= 0 } {
-# FIXME: Knowing it is configured is not enough. We should do two more
-# checks here. First, we need to run llvm-gcc -print-prog-name=$file to get
-# the path to the compiler. If we don't get a path, the language isn't
-# properly configured or built. If we do get a path, we should check to 
make
-# sure that it is executable and perhaps even try executing it.
-return 1;
+  foreach supported_lang [split "$llvmgcc_langs" ,] {
+if { "$lang" == "$supported_lang" } {
+  # FIXME: Knowing it is configured is not enough. We should do two more
+  # checks here. First, we need to run llvm-gcc -print-prog-name=$file to 
+  # get the path to the compiler. If we don't get a path, the language 
isn't
+  # properly configured or built. If we do get a path, we should check to 
+  # make sure that it is executable and perhaps even try executing it.
+  return 1;
+}
   }
   return 0;
 }



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


[llvm-commits] CVS: llvm/lib/Bitcode/Writer/ValueEnumerator.h

2007-04-23 Thread Chris Lattner


Changes in directory llvm/lib/Bitcode/Writer:

ValueEnumerator.h updated: 1.1 -> 1.2
---
Log message:

fix off-by one


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

 ValueEnumerator.h |2 +-
 1 files changed, 1 insertion(+), 1 deletion(-)


Index: llvm/lib/Bitcode/Writer/ValueEnumerator.h
diff -u llvm/lib/Bitcode/Writer/ValueEnumerator.h:1.1 
llvm/lib/Bitcode/Writer/ValueEnumerator.h:1.2
--- llvm/lib/Bitcode/Writer/ValueEnumerator.h:1.1   Sun Apr 22 01:24:45 2007
+++ llvm/lib/Bitcode/Writer/ValueEnumerator.h   Mon Apr 23 16:23:41 2007
@@ -54,7 +54,7 @@
   unsigned getValueID(const Value *V) const {
 ValueMapType::const_iterator I = ValueMap.find(V);
 assert(I != ValueMap.end() && "Value not in slotcalculator!");
-return I->second;
+return I->second-1;
   }
   
   unsigned getTypeID(const Type *T) const {



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


[llvm-commits] CVS: llvm/lib/Bitcode/Reader/BitcodeReader.cpp BitcodeReader.h

2007-04-23 Thread Chris Lattner


Changes in directory llvm/lib/Bitcode/Reader:

BitcodeReader.cpp updated: 1.3 -> 1.4
BitcodeReader.h updated: 1.3 -> 1.4
---
Log message:

Read global symtab


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

 BitcodeReader.cpp |   59 +++---
 BitcodeReader.h   |3 ++
 2 files changed, 59 insertions(+), 3 deletions(-)


Index: llvm/lib/Bitcode/Reader/BitcodeReader.cpp
diff -u llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.3 
llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.4
--- llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.3   Mon Apr 23 13:58:34 2007
+++ llvm/lib/Bitcode/Reader/BitcodeReader.cpp   Mon Apr 23 16:26:05 2007
@@ -15,12 +15,14 @@
 #include "llvm/Bitcode/BitstreamReader.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/Module.h"
+#include "llvm/ADT/SmallString.h"
 using namespace llvm;
 
 /// ConvertToString - Convert a string from a record into an std::string, 
return
 /// true on failure.
+template
 static bool ConvertToString(SmallVector &Record, unsigned Idx,
-std::string &Result) {
+StrTy &Result) {
   if (Record.size() < Idx+1 || Record.size() < Record[Idx]+Idx+1)
 return true;
   
@@ -255,6 +257,52 @@
   }
 }
 
+bool BitcodeReader::ParseValueSymbolTable(BitstreamReader &Stream) {
+  if (Stream.EnterSubBlock())
+return Error("Malformed block record");
+
+  SmallVector Record;
+  
+  // Read all the records for this value table.
+  SmallString<128> ValueName;
+  while (1) {
+unsigned Code = Stream.ReadCode();
+if (Code == bitc::END_BLOCK)
+  return Stream.ReadBlockEnd();
+
+if (Code == bitc::ENTER_SUBBLOCK) {
+  // No known subblocks, always skip them.
+  Stream.ReadSubBlockID();
+  if (Stream.SkipBlock())
+return Error("Malformed block record");
+  continue;
+}
+
+if (Code == bitc::DEFINE_ABBREV) {
+  Stream.ReadAbbrevRecord();
+  continue;
+}
+
+// Read a record.
+Record.clear();
+switch (Stream.ReadRecord(Code, Record)) {
+default:  // Default behavior: unknown type.
+  break;
+case bitc::VST_ENTRY_CODE:// VST_ENTRY: [valueid, namelen, namechar x 
N]
+  if (ConvertToString(Record, 1, ValueName))
+return Error("Invalid TST_ENTRY record");
+  unsigned ValueID = Record[0];
+  if (ValueID >= ValueList.size())
+return Error("Invalid Value ID in VST_ENTRY record");
+  Value *V = ValueList[ValueID];
+  
+  V->setName(&ValueName[0], ValueName.size());
+  ValueName.clear();
+  break;
+}
+  }
+}
+
 
 bool BitcodeReader::ParseModule(BitstreamReader &Stream,
 const std::string &ModuleID) {
@@ -291,6 +339,10 @@
 if (ParseTypeSymbolTable(Stream))
   return true;
 break;
+  case bitc::VALUE_SYMTAB_BLOCK_ID:
+if (ParseValueSymbolTable(Stream))
+  return true;
+break;
   }
   continue;
 }
@@ -377,7 +429,8 @@
   NewGV->setVisibility(Visibility);
   NewGV->setThreadLocal(isThreadLocal);
   
-  // TODO: Add to value table.
+  ValueList.push_back(NewGV);
+  
   // TODO: remember initializer/global pair for later substitution.
   break;
 }
@@ -407,7 +460,7 @@
   }
   Func->setVisibility(GetDecodedVisibility(Record[6]));
   
-  // TODO: Add to value table.
+  ValueList.push_back(Func);
   // TODO: remember initializer/global pair for later substitution.
   break;
 }


Index: llvm/lib/Bitcode/Reader/BitcodeReader.h
diff -u llvm/lib/Bitcode/Reader/BitcodeReader.h:1.3 
llvm/lib/Bitcode/Reader/BitcodeReader.h:1.4
--- llvm/lib/Bitcode/Reader/BitcodeReader.h:1.3 Sun Apr 22 20:01:37 2007
+++ llvm/lib/Bitcode/Reader/BitcodeReader.h Mon Apr 23 16:26:05 2007
@@ -21,11 +21,13 @@
 
 namespace llvm {
   class BitstreamReader;
+  class Value;
 
 class BitcodeReader : public ModuleProvider {
   const char *ErrorString;
   
   std::vector TypeList;
+  std::vector ValueList;
 public:
   virtual ~BitcodeReader() {}
   
@@ -59,6 +61,7 @@
   bool ParseModule(BitstreamReader &Stream, const std::string &ModuleID);
   bool ParseTypeTable(BitstreamReader &Stream);
   bool ParseTypeSymbolTable(BitstreamReader &Stream);
+  bool ParseValueSymbolTable(BitstreamReader &Stream);
 };
   
 } // End llvm namespace



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


[llvm-commits] [126432] clarify the relation of this file with README.LLVM.

2007-04-23 Thread clattner
Revision: 126432
Author:   clattner
Date: 2007-04-23 14:52:56 -0700 (Mon, 23 Apr 2007)

Log Message:
---
clarify the relation of this file with README.LLVM.

Modified Paths:
--
apple-local/branches/llvm/README.Apple

Modified: apple-local/branches/llvm/README.Apple
===
--- apple-local/branches/llvm/README.Apple  2007-04-23 20:32:59 UTC (rev 
126431)
+++ apple-local/branches/llvm/README.Apple  2007-04-23 21:52:56 UTC (rev 
126432)
@@ -1,5 +1,13 @@
 APPLE LOCAL file documentation
+//===--===//
 
+NOTE: This file contains a description of the non-llvm GCC that llvm-gcc is 
+based on.  For information on building llvm-gcc for any platform (including
+Apple), please follow the directions in README.LLVM.
+
+//===--===//
+
+
 This file describes Apple's version of GCC 4.x modified for Darwin /
 Mac OS X.  Although Apple's stated policy is to contribute all of its
 GCC work to the FSF GCC mainstream, at any given moment there will be


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


[llvm-commits] [126435] Fix PR 1344

2007-04-23 Thread dpatel
Revision: 126435
Author:   dpatel
Date: 2007-04-23 15:07:27 -0700 (Mon, 23 Apr 2007)

Log Message:
---
Fix PR 1344

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

Modified: apple-local/branches/llvm/gcc/llvm-types.cpp
===
--- apple-local/branches/llvm/gcc/llvm-types.cpp2007-04-23 22:06:28 UTC 
(rev 126434)
+++ apple-local/branches/llvm/gcc/llvm-types.cpp2007-04-23 22:07:27 UTC 
(rev 126435)
@@ -1560,8 +1560,10 @@
   bool OldConvertingStruct = ConvertingStruct;
   ConvertingStruct = true;
   
-  // Find the type with the largest size, and if we have multiple things with
-  // the same size, the thing with the largest alignment.
+  // Find the type with the largest aligment, and if we have multiple types 
with
+  // the same alignment, select one with largest size. If type with max. align
+  // is smaller then other types then we will add padding later on anyway to 
+  // match union size.
   const TargetData &TD = getTargetData();
   const Type *UnionTy = 0;
   unsigned MaxSize = 0, MaxAlign = 0;
@@ -1576,9 +1578,10 @@
 const Type *TheTy = ConvertType(TREE_TYPE(Field));
 unsigned Size = TD.getTypeSize(TheTy);
 unsigned Align = TD.getABITypeAlignment(TheTy);
-if (UnionTy == 0 || Size>MaxSize || (Size == MaxSize && Align > MaxAlign)) 
{
+if (UnionTy == 0 || Align > MaxAlign 
+|| (MaxAlign == Align && Size > MaxSize)) {
   UnionTy = TheTy;
-  MaxSize = Size;
+  MaxSize = MAX(MaxSize, Size);
   MaxAlign = Align;
 }
   }


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


[llvm-commits] CVS: llvm/test/Transforms/LoopStrengthReduce/2007-04-23-UseIterator.ll

2007-04-23 Thread Devang Patel


Changes in directory llvm/test/Transforms/LoopStrengthReduce:

2007-04-23-UseIterator.ll added (r1.1)
---
Log message:

New test.


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

 2007-04-23-UseIterator.ll |   71 ++
 1 files changed, 71 insertions(+)


Index: llvm/test/Transforms/LoopStrengthReduce/2007-04-23-UseIterator.ll
diff -c /dev/null 
llvm/test/Transforms/LoopStrengthReduce/2007-04-23-UseIterator.ll:1.1
*** /dev/null   Mon Apr 23 17:40:03 2007
--- llvm/test/Transforms/LoopStrengthReduce/2007-04-23-UseIterator.ll   Mon Apr 
23 17:39:53 2007
***
*** 0 
--- 1,71 
+ ; RUN: llvm-as < %s | opt -loop-reduce -disable-output
+ 
+ target datalayout = 
"e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64"
+ 
+ target triple = "i686-apple-darwin9"
+ 
+ define i8* @foo( i8* %ABC) {
+ entry:
+   switch i8 0, label %bb129 [
+i8 0, label %UnifiedReturnBlock
+i8 9, label %UnifiedReturnBlock
+i8 32, label %UnifiedReturnBlock
+i8 35, label %UnifiedReturnBlock
+i8 37, label %bb16.preheader
+   ]
+ 
+ bb16.preheader:   ; preds = %entry
+   br label %bb16
+ 
+ bb16: ; preds = %cond_next102, %bb16.preheader
+   %indvar = phi i32 [ %indvar.next, %cond_next102 ], [ 0, %bb16.preheader 
]   ;  [#uses=2]
+   %ABC.2146.0.rec = mul i32 %indvar, 3;  [#uses=1]
+   br i1 false, label %UnifiedReturnBlock.loopexit, label %cond_next102
+ 
+ cond_next102: ; preds = %bb16
+   %tmp138145.rec = add i32 %ABC.2146.0.rec, 3 ;  
[#uses=1]
+   %tmp138145 = getelementptr i8* %ABC, i32 %tmp138145.rec ;  
[#uses=4]
+   %indvar.next = add i32 %indvar, 1   ;  [#uses=1]
+   switch i8 0, label %bb129.loopexit [
+i8 0, label %UnifiedReturnBlock.loopexit
+i8 9, label %UnifiedReturnBlock.loopexit
+i8 32, label %UnifiedReturnBlock.loopexit
+i8 35, label %UnifiedReturnBlock.loopexit
+i8 37, label %bb16
+   ]
+ 
+ bb129.loopexit:   ; preds = %cond_next102
+   br label %bb129
+ 
+ bb129:; preds = %bb129.loopexit, %entry
+   ret i8* null
+ 
+ UnifiedReturnBlock.loopexit:  ; preds = %cond_next102, %cond_next102, 
%cond_next102, %cond_next102, %bb16
+   %UnifiedRetVal.ph = phi i8* [ %tmp138145, %cond_next102 ], [ 
%tmp138145, %cond_next102 ], [ %tmp138145, %cond_next102 ], [ %tmp138145, 
%cond_next102 ], [ null, %bb16 ] ;  [#uses=0]
+   br label %UnifiedReturnBlock
+ 
+ UnifiedReturnBlock:   ; preds = %UnifiedReturnBlock.loopexit, %entry, 
%entry, %entry, %entry
+   ret i8* null
+ }
+ 
+ define i8* @bar() {
+ entry:
+   switch i8 0, label %bb158 [
+i8 37, label %bb74
+i8 58, label %cond_true
+i8 64, label %bb11
+   ]
+ 
+ bb11: ; preds = %entry
+   ret i8* null
+ 
+ cond_true:; preds = %entry
+   ret i8* null
+ 
+ bb74: ; preds = %entry
+   ret i8* null
+ 
+ bb158:; preds = %entry
+   ret i8* null
+ }
+ 



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


[llvm-commits] CVS: llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp

2007-04-23 Thread Devang Patel


Changes in directory llvm/lib/Transforms/Scalar:

LoopStrengthReduce.cpp updated: 1.130 -> 1.131
---
Log message:

Fix
http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20070423/048333.html


---
Diffs of the changes:  (+9 -5)

 LoopStrengthReduce.cpp |   14 +-
 1 files changed, 9 insertions(+), 5 deletions(-)


Index: llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
diff -u llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp:1.130 
llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp:1.131
--- llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp:1.130 Sun Apr 15 
03:47:27 2007
+++ llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp   Mon Apr 23 17:42:03 2007
@@ -416,12 +416,16 @@
   if (!getSCEVStartAndStride(ISE, L, Start, Stride))
 return false;  // Non-reducible symbolic expression, bail out.
 
-  for (Value::use_iterator UI = I->use_begin(), E = I->use_end(); UI != E;) {
-Instruction *User = cast(*UI);
+  std::vector IUsers;
+  // Collect all I uses now because IVUseShouldUsePostIncValue may 
+  // invalidate use_iterator.
+  for (Value::use_iterator UI = I->use_begin(), E = I->use_end(); UI != E; 
++UI)
+IUsers.push_back(cast(*UI));
 
-// Increment iterator now because IVUseShouldUsePostIncValue may remove 
-// User from the list of I users.
-++UI;
+  for (unsigned iused_index = 0, iused_size = IUsers.size(); 
+   iused_index != iused_size; ++iused_index) {
+
+Instruction *User = IUsers[iused_index];
 
 // Do not infinitely recurse on PHI nodes.
 if (isa(User) && Processed.count(User))



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


[llvm-commits] CVS: llvm/include/llvm/CodeGen/ValueTypes.h

2007-04-23 Thread Christopher Lamb


Changes in directory llvm/include/llvm/CodeGen:

ValueTypes.h updated: 1.32 -> 1.33
---
Log message:

Fix bug in isFloatingPoint()


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

 ValueTypes.h |2 +-
 1 files changed, 1 insertion(+), 1 deletion(-)


Index: llvm/include/llvm/CodeGen/ValueTypes.h
diff -u llvm/include/llvm/CodeGen/ValueTypes.h:1.32 
llvm/include/llvm/CodeGen/ValueTypes.h:1.33
--- llvm/include/llvm/CodeGen/ValueTypes.h:1.32 Sun Apr  1 02:17:45 2007
+++ llvm/include/llvm/CodeGen/ValueTypes.h  Mon Apr 23 17:50:40 2007
@@ -85,7 +85,7 @@
   /// MVT::isFloatingPoint - Return true if this is a simple FP, or a packed
   /// vector FP type.
   static inline bool isFloatingPoint(ValueType VT) {
-return (VT >= f32 && VT <= f128) || (VT >= v4f32 && VT <= v2f64);
+return (VT >= f32 && VT <= f128) || (VT >= v2f32 && VT <= v2f64);
   }
   
   /// MVT::isVector - Return true if this is a packed vector type (i.e. not 



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


[llvm-commits] CVS: llvm/include/llvm/Bitcode/LLVMBitCodes.h

2007-04-23 Thread Chris Lattner


Changes in directory llvm/include/llvm/Bitcode:

LLVMBitCodes.h updated: 1.2 -> 1.3
---
Log message:

add codes for constants table


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

 LLVMBitCodes.h |   20 +---
 1 files changed, 17 insertions(+), 3 deletions(-)


Index: llvm/include/llvm/Bitcode/LLVMBitCodes.h
diff -u llvm/include/llvm/Bitcode/LLVMBitCodes.h:1.2 
llvm/include/llvm/Bitcode/LLVMBitCodes.h:1.3
--- llvm/include/llvm/Bitcode/LLVMBitCodes.h:1.2Mon Apr 23 15:34:46 2007
+++ llvm/include/llvm/Bitcode/LLVMBitCodes.hMon Apr 23 18:29:59 2007
@@ -30,7 +30,7 @@
 // Module sub-block id's
 TYPE_BLOCK_ID= 1,
 MODULEINFO_BLOCK_ID  = 2,
-GLOBALCONSTANTS_BLOCK_ID = 3,
+CONSTANTS_BLOCK_ID   = 3,
 FUNCTION_BLOCK_ID= 4,
 TYPE_SYMTAB_BLOCK_ID = 5,
 VALUE_SYMTAB_BLOCK_ID= 6
@@ -78,12 +78,26 @@
   
   // The type symbol table only has one code (TST_ENTRY_CODE).
   enum TypeSymtabCodes {
-TST_ENTRY_CODE = 1 // TST_ENTRY: [typeid, namelen, namechar x N]
+TST_CODE_ENTRY = 1 // TST_ENTRY: [typeid, namelen, namechar x N]
   };
   
   // The value symbol table only has one code (VST_ENTRY_CODE).
   enum ValueSymtabCodes {
-VST_ENTRY_CODE = 1 // VST_ENTRY: [valid, namelen, namechar x N]
+VST_CODE_ENTRY = 1 // VST_ENTRY: [valid, namelen, namechar x N]
+  };
+  
+  // The constants block (CONSTANTS_BLOCK_ID) describes emission for each
+  // constant and maintains an implicit current type value.
+  enum ConstantsSymtabCodes {
+CST_CODE_SETTYPE  = 1,  // SETTYPE: [typeid]
+CST_CODE_NULL = 2,  // NULL
+CST_CODE_UNDEF= 3,  // UNDEF
+CST_CODE_INTEGER  = 4,  // INTEGER: [intval]
+CST_CODE_WIDE_INTEGER = 5,  // WIDE_INTEGER: [n, n x intval]
+CST_CODE_FLOAT= 6,  // FLOAT: [fpval]
+CST_CODE_AGGREGATE= 7,  // AGGREGATE: [n, n x value number]
+CST_CODE_CONSTEXPR= 8   // CONSTEXPR: [opcode, n, n x val#]
+// TODO: CE_BINOP ETC
   };
   
 } // End bitc namespace



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


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

2007-04-23 Thread Dale Johannesen


Changes in directory llvm/lib/CodeGen:

AsmPrinter.cpp updated: 1.155 -> 1.156
---
Log message:

modify per review commentary


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

 AsmPrinter.cpp |4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)


Index: llvm/lib/CodeGen/AsmPrinter.cpp
diff -u llvm/lib/CodeGen/AsmPrinter.cpp:1.155 
llvm/lib/CodeGen/AsmPrinter.cpp:1.156
--- llvm/lib/CodeGen/AsmPrinter.cpp:1.155   Mon Apr 23 14:58:54 2007
+++ llvm/lib/CodeGen/AsmPrinter.cpp Mon Apr 23 18:33:31 2007
@@ -582,8 +582,8 @@
 // Use the maximum of the specified alignment and the alignment from the
 // specified GlobalValue (if any).
 void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV) const {
-  if (GV && GV->getAlignment() && Log2_32(GV->getAlignment()) > NumBits)
-NumBits = Log2_32(GV->getAlignment());
+  if (GV && GV->getAlignment())
+NumBits = std::max(NumBits, Log2_32(GV->getAlignment()));
   if (NumBits == 0) return;   // No need to emit alignment.
   if (TAI->getAlignmentIsInBytes()) NumBits = 1 << NumBits;
   O << TAI->getAlignDirective() << NumBits << "\n";



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


[llvm-commits] CVS: llvm/lib/Bitcode/Writer/ValueEnumerator.cpp ValueEnumerator.h Writer.cpp

2007-04-23 Thread Chris Lattner


Changes in directory llvm/lib/Bitcode/Writer:

ValueEnumerator.cpp updated: 1.1 -> 1.2
ValueEnumerator.h updated: 1.2 -> 1.3
Writer.cpp updated: 1.5 -> 1.6
---
Log message:

Emit module-level constants.


---
Diffs of the changes:  (+118 -10)

 ValueEnumerator.cpp |5 +-
 ValueEnumerator.h   |8 +--
 Writer.cpp  |  115 ++--
 3 files changed, 118 insertions(+), 10 deletions(-)


Index: llvm/lib/Bitcode/Writer/ValueEnumerator.cpp
diff -u llvm/lib/Bitcode/Writer/ValueEnumerator.cpp:1.1 
llvm/lib/Bitcode/Writer/ValueEnumerator.cpp:1.2
--- llvm/lib/Bitcode/Writer/ValueEnumerator.cpp:1.1 Sun Apr 22 01:24:45 2007
+++ llvm/lib/Bitcode/Writer/ValueEnumerator.cpp Mon Apr 23 19:16:04 2007
@@ -56,9 +56,12 @@
 
   
   // FIXME: std::partition the type and value tables so that first-class types
-  // come earlier than aggregates.
+  // come earlier than aggregates.  FIXME: Emit a marker into the module
+  // indicating which aggregates types AND values can be dropped form the 
table.
   
   // FIXME: Sort type/value tables by frequency.
+
+  // FIXME: Sort constants by type to reduce size.
 }
 
 /// EnumerateTypeSymbolTable - Insert all of the types in the specified symbol


Index: llvm/lib/Bitcode/Writer/ValueEnumerator.h
diff -u llvm/lib/Bitcode/Writer/ValueEnumerator.h:1.2 
llvm/lib/Bitcode/Writer/ValueEnumerator.h:1.3
--- llvm/lib/Bitcode/Writer/ValueEnumerator.h:1.2   Mon Apr 23 16:23:41 2007
+++ llvm/lib/Bitcode/Writer/ValueEnumerator.h   Mon Apr 23 19:16:04 2007
@@ -35,15 +35,13 @@
   // For each value, we remember its Value* and occurrence frequency.
   typedef std::vector > ValueList;
 private:
-  TypeList Types;
-  
   typedef DenseMap TypeMapType;
   TypeMapType TypeMap;
+  TypeList Types;
 
-  ValueList Values;
-  
   typedef DenseMap ValueMapType;
   ValueMapType ValueMap;
+  ValueList Values;
   
   
   ValueEnumerator(const ValueEnumerator &);  // DO NOT IMPLEMENT
@@ -63,7 +61,7 @@
 return I->second-1;
   }
 
-
+  const ValueList &getValues() const { return Values; }
   const TypeList &getTypes() const { return Types; }
 
   /// incorporateFunction/purgeFunction - If you'd like to deal with a 
function,


Index: llvm/lib/Bitcode/Writer/Writer.cpp
diff -u llvm/lib/Bitcode/Writer/Writer.cpp:1.5 
llvm/lib/Bitcode/Writer/Writer.cpp:1.6
--- llvm/lib/Bitcode/Writer/Writer.cpp:1.5  Mon Apr 23 15:35:01 2007
+++ llvm/lib/Bitcode/Writer/Writer.cpp  Mon Apr 23 19:16:04 2007
@@ -15,6 +15,7 @@
 #include "llvm/Bitcode/BitstreamWriter.h"
 #include "llvm/Bitcode/LLVMBitCodes.h"
 #include "ValueEnumerator.h"
+#include "llvm/Constants.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/Module.h"
 #include "llvm/TypeSymbolTable.h"
@@ -296,7 +297,7 @@
   NameVals.push_back(Str[i]);
 
 // Emit the finished record.
-Stream.EmitRecord(bitc::TST_ENTRY_CODE, NameVals, AbbrevToUse);
+Stream.EmitRecord(bitc::VST_CODE_ENTRY, NameVals, AbbrevToUse);
 NameVals.clear();
   }
   
@@ -327,13 +328,118 @@
   NameVals.push_back((unsigned char)*P);
 
 // Emit the finished record.
-Stream.EmitRecord(bitc::VST_ENTRY_CODE, NameVals, AbbrevToUse);
+Stream.EmitRecord(bitc::VST_CODE_ENTRY, NameVals, AbbrevToUse);
 NameVals.clear();
   }
   Stream.ExitBlock();
 }
 
+static void WriteConstants(unsigned FirstVal, unsigned LastVal,
+   const ValueEnumerator &VE,
+   BitstreamWriter &Stream) {
+  if (FirstVal == LastVal) return;
+  
+  Stream.EnterSubblock(bitc::CONSTANTS_BLOCK_ID, 2);
+
+  // FIXME: Install and use abbrevs to reduce size.
+  
+  SmallVector Record;
+
+  const ValueEnumerator::ValueList &Vals = VE.getValues();
+  const Type *LastTy = 0;
+  for (unsigned i = FirstVal; i != LastVal; ++i) {
+const Value *V = Vals[i].first;
+// If we need to switch types, do so now.
+if (V->getType() != LastTy) {
+  LastTy = V->getType();
+  Record.push_back(VE.getTypeID(LastTy));
+  Stream.EmitRecord(bitc::CST_CODE_SETTYPE, Record);
+  Record.clear();
+}
+
+if (const InlineAsm *IA = dyn_cast(V)) {
+  assert(0 && IA && "FIXME: Inline asm writing unimp!");
+  continue;
+}
+const Constant *C = cast(V);
+unsigned Code = -1U;
+unsigned AbbrevToUse = 0;
+if (C->isNullValue()) {
+  Code = bitc::CST_CODE_NULL;
+} else if (isa(C)) {
+  Code = bitc::CST_CODE_UNDEF;
+} else if (const ConstantInt *IV = dyn_cast(C)) {
+  if (IV->getBitWidth() <= 64) {
+int64_t V = IV->getSExtValue();
+if (V >= 0)
+  Record.push_back(V << 1);
+else
+  Record.push_back((-V << 1) | 1);
+Code = bitc::CST_CODE_INTEGER;
+  } else { // Wide integers, > 64 bits in size.
+// We have an arbitrary precision integer value to write whose 
+// bit width is > 64. However, in canonical unsigned integer 
+// format it is likely that 

[llvm-commits] CVS: llvm/lib/Bitcode/Reader/BitcodeReader.cpp BitcodeReader.h

2007-04-23 Thread Chris Lattner


Changes in directory llvm/lib/Bitcode/Reader:

BitcodeReader.cpp updated: 1.4 -> 1.5
BitcodeReader.h updated: 1.4 -> 1.5
---
Log message:

track global inits


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

 BitcodeReader.cpp |   10 +++---
 BitcodeReader.h   |2 ++
 2 files changed, 9 insertions(+), 3 deletions(-)


Index: llvm/lib/Bitcode/Reader/BitcodeReader.cpp
diff -u llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.4 
llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.5
--- llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.4   Mon Apr 23 16:26:05 2007
+++ llvm/lib/Bitcode/Reader/BitcodeReader.cpp   Mon Apr 23 19:18:21 2007
@@ -243,7 +243,7 @@
 switch (Stream.ReadRecord(Code, Record)) {
 default:  // Default behavior: unknown type.
   break;
-case bitc::TST_ENTRY_CODE:// TST_ENTRY: [typeid, namelen, namechar x N]
+case bitc::TST_CODE_ENTRY:// TST_ENTRY: [typeid, namelen, namechar x N]
   if (ConvertToString(Record, 1, TypeName))
 return Error("Invalid TST_ENTRY record");
   unsigned TypeID = Record[0];
@@ -288,7 +288,7 @@
 switch (Stream.ReadRecord(Code, Record)) {
 default:  // Default behavior: unknown type.
   break;
-case bitc::VST_ENTRY_CODE:// VST_ENTRY: [valueid, namelen, namechar x 
N]
+case bitc::TST_CODE_ENTRY:// VST_ENTRY: [valueid, namelen, namechar x 
N]
   if (ConvertToString(Record, 1, ValueName))
 return Error("Invalid TST_ENTRY record");
   unsigned ValueID = Record[0];
@@ -358,6 +358,8 @@
 case bitc::MODULE_CODE_VERSION:  // VERSION: [version#]
   if (Record.size() < 1)
 return Error("Malformed MODULE_CODE_VERSION");
+  if (!GlobalInits.empty())
+return Error("Malformed global initializer set");
   // Only version #0 is supported so far.
   if (Record[0] != 0)
 return Error("Unknown bitstream version!");
@@ -431,7 +433,9 @@
   
   ValueList.push_back(NewGV);
   
-  // TODO: remember initializer/global pair for later substitution.
+  // Remember which value to use for the global initializer.
+  if (unsigned InitID = Record[2])
+GlobalInits.push_back(std::make_pair(NewGV, InitID-1));
   break;
 }
 // FUNCTION:  [type, callingconv, isproto, linkage, alignment, section,


Index: llvm/lib/Bitcode/Reader/BitcodeReader.h
diff -u llvm/lib/Bitcode/Reader/BitcodeReader.h:1.4 
llvm/lib/Bitcode/Reader/BitcodeReader.h:1.5
--- llvm/lib/Bitcode/Reader/BitcodeReader.h:1.4 Mon Apr 23 16:26:05 2007
+++ llvm/lib/Bitcode/Reader/BitcodeReader.h Mon Apr 23 19:18:21 2007
@@ -22,12 +22,14 @@
 namespace llvm {
   class BitstreamReader;
   class Value;
+  class GlobalValue;
 
 class BitcodeReader : public ModuleProvider {
   const char *ErrorString;
   
   std::vector TypeList;
   std::vector ValueList;
+  std::vector > GlobalInits;
 public:
   virtual ~BitcodeReader() {}
   



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


[llvm-commits] CVS: llvm/lib/Bitcode/Reader/BitcodeReader.cpp

2007-04-23 Thread Chris Lattner


Changes in directory llvm/lib/Bitcode/Reader:

BitcodeReader.cpp updated: 1.5 -> 1.6
---
Log message:

move check to the right place :)


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

 BitcodeReader.cpp |7 ---
 1 files changed, 4 insertions(+), 3 deletions(-)


Index: llvm/lib/Bitcode/Reader/BitcodeReader.cpp
diff -u llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.5 
llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.6
--- llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.5   Mon Apr 23 19:18:21 2007
+++ llvm/lib/Bitcode/Reader/BitcodeReader.cpp   Mon Apr 23 19:21:45 2007
@@ -322,8 +322,11 @@
   // Read all the records for this module.
   while (!Stream.AtEndOfStream()) {
 unsigned Code = Stream.ReadCode();
-if (Code == bitc::END_BLOCK)
+if (Code == bitc::END_BLOCK) {
+  if (!GlobalInits.empty())
+return Error("Malformed global initializer set");
   return Stream.ReadBlockEnd();
+}
 
 if (Code == bitc::ENTER_SUBBLOCK) {
   switch (Stream.ReadSubBlockID()) {
@@ -358,8 +361,6 @@
 case bitc::MODULE_CODE_VERSION:  // VERSION: [version#]
   if (Record.size() < 1)
 return Error("Malformed MODULE_CODE_VERSION");
-  if (!GlobalInits.empty())
-return Error("Malformed global initializer set");
   // Only version #0 is supported so far.
   if (Record[0] != 0)
 return Error("Unknown bitstream version!");



___
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-04-23 Thread Scott Michel


Changes in directory llvm/lib/CodeGen/SelectionDAG:

SelectionDAGISel.cpp updated: 1.424 -> 1.425
---
Log message:

Use '-1U' where '-1UL' is obvious overkill, eliminating gcc warnings about
tests always being true in the process.


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

 SelectionDAGISel.cpp |4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)


Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.424 
llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.425
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.424Sun Apr 22 
18:15:29 2007
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp  Mon Apr 23 20:24:20 2007
@@ -1177,7 +1177,7 @@
 /// visitJumpTable - Emit JumpTable node in the current MBB
 void SelectionDAGLowering::visitJumpTable(SelectionDAGISel::JumpTable &JT) {
   // Emit the code for the jump table
-  assert(JT.Reg != -1UL && "Should lower JT Header first!");
+  assert(JT.Reg != -1U && "Should lower JT Header first!");
   MVT::ValueType PTy = TLI.getPointerTy();
   SDOperand Index = DAG.getCopyFromReg(getRoot(), JT.Reg, PTy);
   SDOperand Table = DAG.getJumpTable(JT.JTI, PTy);
@@ -1544,7 +1544,7 @@
   
   // Set the jump table information so that we can codegen it as a second
   // MachineBasicBlock
-  SelectionDAGISel::JumpTable JT(-1UL, JTI, JumpTableBB, Default);
+  SelectionDAGISel::JumpTable JT(-1U, JTI, JumpTableBB, Default);
   SelectionDAGISel::JumpTableHeader JTH(First, Last, SV, CR.CaseBB,
 (CR.CaseBB == CurMBB));
   if (CR.CaseBB == CurMBB)



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


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

2007-04-23 Thread Chris Lattner


Changes in directory llvm/lib/Bitcode/Writer:

Writer.cpp updated: 1.6 -> 1.7
---
Log message:

fix off-by-one computing size for section abbrevs


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

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


Index: llvm/lib/Bitcode/Writer/Writer.cpp
diff -u llvm/lib/Bitcode/Writer/Writer.cpp:1.6 
llvm/lib/Bitcode/Writer/Writer.cpp:1.7
--- llvm/lib/Bitcode/Writer/Writer.cpp:1.6  Mon Apr 23 19:16:04 2007
+++ llvm/lib/Bitcode/Writer/Writer.cpp  Mon Apr 23 22:29:47 2007
@@ -220,7 +220,7 @@
   Abbv->Add(BitCodeAbbrevOp(0));
 else
   Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::FixedWidth,
-   Log2_32_Ceil(SectionMap.size(;
+   Log2_32_Ceil(SectionMap.size()+1)));
 // Don't bother emitting vis + thread local.
 SimpleGVarAbbrev = Stream.EmitAbbrev(Abbv);
   }



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


[llvm-commits] CVS: llvm/lib/Bitcode/Reader/BitcodeReader.cpp BitcodeReader.h

2007-04-23 Thread Chris Lattner


Changes in directory llvm/lib/Bitcode/Reader:

BitcodeReader.cpp updated: 1.6 -> 1.7
BitcodeReader.h updated: 1.5 -> 1.6
---
Log message:

read basic constants: null, undef, integers <= 64bits


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

 BitcodeReader.cpp |   77 ++
 BitcodeReader.h   |5 ++-
 2 files changed, 80 insertions(+), 2 deletions(-)


Index: llvm/lib/Bitcode/Reader/BitcodeReader.cpp
diff -u llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.6 
llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.7
--- llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.6   Mon Apr 23 19:21:45 2007
+++ llvm/lib/Bitcode/Reader/BitcodeReader.cpp   Mon Apr 23 22:30:34 2007
@@ -13,6 +13,7 @@
 
 #include "BitcodeReader.h"
 #include "llvm/Bitcode/BitstreamReader.h"
+#include "llvm/Constants.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/Module.h"
 #include "llvm/ADT/SmallString.h"
@@ -303,6 +304,78 @@
   }
 }
 
+bool BitcodeReader::ParseConstants(BitstreamReader &Stream) {
+  if (Stream.EnterSubBlock())
+return Error("Malformed block record");
+
+  SmallVector Record;
+  
+  // Read all the records for this value table.
+  const Type *CurTy = Type::Int32Ty;
+  while (1) {
+unsigned Code = Stream.ReadCode();
+if (Code == bitc::END_BLOCK) {
+  // If there are global var inits to process, do so now.
+  if (!GlobalInits.empty()) {
+while (!GlobalInits.empty()) {
+  unsigned ValID = GlobalInits.back().second;
+  if (ValID >= ValueList.size())
+return Error("Invalid value ID for global var init!");
+  if (Constant *C = dyn_cast(ValueList[ValID]))
+GlobalInits.back().first->setInitializer(C);
+  else
+return Error("Global variable initializer is not a constant!");
+  GlobalInits.pop_back(); 
+}
+  }
+  
+  return Stream.ReadBlockEnd();
+}
+
+if (Code == bitc::ENTER_SUBBLOCK) {
+  // No known subblocks, always skip them.
+  Stream.ReadSubBlockID();
+  if (Stream.SkipBlock())
+return Error("Malformed block record");
+  continue;
+}
+
+if (Code == bitc::DEFINE_ABBREV) {
+  Stream.ReadAbbrevRecord();
+  continue;
+}
+
+// Read a record.
+Record.clear();
+Value *V = 0;
+switch (Stream.ReadRecord(Code, Record)) {
+default:  // Default behavior: unknown constant
+case bitc::CST_CODE_UNDEF: // UNDEF
+  V = UndefValue::get(CurTy);
+  break;
+case bitc::CST_CODE_SETTYPE:   // SETTYPE: [typeid]
+  if (Record.empty())
+return Error("Malformed CST_SETTYPE record");
+  if (Record[0] >= TypeList.size())
+return Error("Invalid Type ID in CST_SETTYPE record");
+  CurTy = TypeList[Record[0]];
+  continue;
+case bitc::CST_CODE_NULL:  // NULL
+  V = Constant::getNullValue(CurTy);
+  break;
+case bitc::CST_CODE_INTEGER:   // INTEGER: [intval]
+  if (!isa(CurTy))
+return Error("Invalid type for CST_INTEGER");
+  if (Record[0] & 1)
+V = ConstantInt::get(CurTy, -(Record[0]>>1));
+  else
+V = ConstantInt::get(CurTy, Record[0]>>1);
+  break;
+}
+
+ValueList.push_back(V);
+  }
+}
 
 bool BitcodeReader::ParseModule(BitstreamReader &Stream,
 const std::string &ModuleID) {
@@ -346,6 +419,10 @@
 if (ParseValueSymbolTable(Stream))
   return true;
 break;
+  case bitc::CONSTANTS_BLOCK_ID:
+if (ParseConstants(Stream))
+  return true;
+break;
   }
   continue;
 }


Index: llvm/lib/Bitcode/Reader/BitcodeReader.h
diff -u llvm/lib/Bitcode/Reader/BitcodeReader.h:1.5 
llvm/lib/Bitcode/Reader/BitcodeReader.h:1.6
--- llvm/lib/Bitcode/Reader/BitcodeReader.h:1.5 Mon Apr 23 19:18:21 2007
+++ llvm/lib/Bitcode/Reader/BitcodeReader.h Mon Apr 23 22:30:34 2007
@@ -22,14 +22,14 @@
 namespace llvm {
   class BitstreamReader;
   class Value;
-  class GlobalValue;
+  class GlobalVariable;
 
 class BitcodeReader : public ModuleProvider {
   const char *ErrorString;
   
   std::vector TypeList;
   std::vector ValueList;
-  std::vector > GlobalInits;
+  std::vector > GlobalInits;
 public:
   virtual ~BitcodeReader() {}
   
@@ -64,6 +64,7 @@
   bool ParseTypeTable(BitstreamReader &Stream);
   bool ParseTypeSymbolTable(BitstreamReader &Stream);
   bool ParseValueSymbolTable(BitstreamReader &Stream);
+  bool ParseConstants(BitstreamReader &Stream);
 };
   
 } // End llvm namespace



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


[llvm-commits] CVS: llvm/lib/Bitcode/Reader/BitcodeReader.cpp

2007-04-23 Thread Chris Lattner


Changes in directory llvm/lib/Bitcode/Reader:

BitcodeReader.cpp updated: 1.7 -> 1.8
---
Log message:

add supprot for FP constants, wide integers, and fix the encoding of MININT


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

 BitcodeReader.cpp |   48 
 1 files changed, 40 insertions(+), 8 deletions(-)


Index: llvm/lib/Bitcode/Reader/BitcodeReader.cpp
diff -u llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.7 
llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.8
--- llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.7   Mon Apr 23 22:30:34 2007
+++ llvm/lib/Bitcode/Reader/BitcodeReader.cpp   Mon Apr 23 23:04:35 2007
@@ -17,6 +17,7 @@
 #include "llvm/DerivedTypes.h"
 #include "llvm/Module.h"
 #include "llvm/ADT/SmallString.h"
+#include "llvm/Support/MathExtras.h"
 using namespace llvm;
 
 /// ConvertToString - Convert a string from a record into an std::string, 
return
@@ -204,8 +205,8 @@
   const_cast(OldTy)->refineAbstractTypeTo(ResultTy);
   
   // This should have replaced the old opaque type with the new type in the
-  // value table... or with a preexisting type that was already in the 
system.
-  // Let's just make sure it did.
+  // value table... or with a preexisting type that was already in the
+  // system.  Let's just make sure it did.
   assert(TypeList[NumRecords-1].get() != OldTy &&
  "refineAbstractType didn't work!");
 }
@@ -304,6 +305,17 @@
   }
 }
 
+/// DecodeSignRotatedValue - Decode a signed value stored with the sign bit in
+/// the LSB for dense VBR encoding.
+static uint64_t DecodeSignRotatedValue(uint64_t V) {
+  if ((V & 1) == 0)
+return V >> 1;
+  if (V != 1) 
+return -(V >> 1);
+  // There is no such thing as -0 with integers.  "-0" really means MININT.
+  return 1ULL << 63;
+}
+
 bool BitcodeReader::ParseConstants(BitstreamReader &Stream) {
   if (Stream.EnterSubBlock())
 return Error("Malformed block record");
@@ -359,17 +371,37 @@
   if (Record[0] >= TypeList.size())
 return Error("Invalid Type ID in CST_SETTYPE record");
   CurTy = TypeList[Record[0]];
-  continue;
+  continue;  // Skip the ValueList manipulation.
 case bitc::CST_CODE_NULL:  // NULL
   V = Constant::getNullValue(CurTy);
   break;
 case bitc::CST_CODE_INTEGER:   // INTEGER: [intval]
-  if (!isa(CurTy))
-return Error("Invalid type for CST_INTEGER");
-  if (Record[0] & 1)
-V = ConstantInt::get(CurTy, -(Record[0]>>1));
+  if (!isa(CurTy) || Record.empty())
+return Error("Invalid CST_INTEGER record");
+  V = ConstantInt::get(CurTy, DecodeSignRotatedValue(Record[0]));
+  break;
+case bitc::CST_CODE_WIDE_INTEGER: {// WIDE_INTEGER: [n, n x intval]
+  if (!isa(CurTy) || Record.empty() ||
+  Record.size() < Record[0]+1)
+return Error("Invalid WIDE_INTEGER record");
+  
+  unsigned NumWords = Record[0];
+  uint64_t *Data = new uint64_t[NumWords];
+  for (unsigned i = 0; i != NumWords; ++i)
+Data[i] = DecodeSignRotatedValue(Record[i+1]);
+  V = ConstantInt::get(APInt(cast(CurTy)->getBitWidth(),
+ NumWords, Data));
+  break;
+}
+case bitc::CST_CODE_FLOAT: // FLOAT: [fpval]
+  if (Record.empty())
+return Error("Invalid FLOAT record");
+  if (CurTy == Type::FloatTy)
+V = ConstantFP::get(CurTy, BitsToFloat(Record[0]));
+  else if (CurTy == Type::DoubleTy)
+V = ConstantFP::get(CurTy, BitsToDouble(Record[0]));
   else
-V = ConstantInt::get(CurTy, Record[0]>>1);
+V = UndefValue::get(CurTy);
   break;
 }
 



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


[llvm-commits] CVS: llvm/lib/Bitcode/Reader/BitcodeReader.cpp BitcodeReader.h

2007-04-23 Thread Chris Lattner


Changes in directory llvm/lib/Bitcode/Reader:

BitcodeReader.cpp updated: 1.8 -> 1.9
BitcodeReader.h updated: 1.6 -> 1.7
---
Log message:

implement support for reading aggregate constants, including handling forward
constant references, etc.


---
Diffs of the changes:  (+108 -5)

 BitcodeReader.cpp |   78 +-
 BitcodeReader.h   |   35 +---
 2 files changed, 108 insertions(+), 5 deletions(-)


Index: llvm/lib/Bitcode/Reader/BitcodeReader.cpp
diff -u llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.8 
llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.9
--- llvm/lib/Bitcode/Reader/BitcodeReader.cpp:1.8   Mon Apr 23 23:04:35 2007
+++ llvm/lib/Bitcode/Reader/BitcodeReader.cpp   Tue Apr 24 00:48:56 2007
@@ -55,6 +55,39 @@
   }
 }
 
+namespace {
+  /// @brief A class for maintaining the slot number definition
+  /// as a placeholder for the actual definition for forward constants defs.
+  class ConstantPlaceHolder : public ConstantExpr {
+ConstantPlaceHolder();   // DO NOT IMPLEMENT
+void operator=(const ConstantPlaceHolder &); // DO NOT IMPLEMENT
+public:
+  Use Op;
+  ConstantPlaceHolder(const Type *Ty)
+: ConstantExpr(Ty, Instruction::UserOp1, &Op, 1),
+  Op(UndefValue::get(Type::Int32Ty), this) {
+}
+  };
+}
+
+Constant *BitcodeReaderValueList::getConstantFwdRef(unsigned Idx,
+const Type *Ty) {
+  if (Idx >= size()) {
+// Insert a bunch of null values.
+Uses.resize(Idx+1);
+OperandList = &Uses[0];
+NumOperands = Idx+1;
+  }
+
+  if (Uses[Idx])
+return cast(getOperand(Idx));
+
+  // Create and return a placeholder, which will later be RAUW'd.
+  Constant *C = new ConstantPlaceHolder(Ty);
+  Uses[Idx].init(C, this);
+  return C;
+}
+
 
 const Type *BitcodeReader::getTypeByID(unsigned ID, bool isTypeTable) {
   // If the TypeID is in range, return it.
@@ -324,6 +357,7 @@
   
   // Read all the records for this value table.
   const Type *CurTy = Type::Int32Ty;
+  unsigned NextCstNo = ValueList.size();
   while (1) {
 unsigned Code = Stream.ReadCode();
 if (Code == bitc::END_BLOCK) {
@@ -341,6 +375,9 @@
 }
   }
   
+  if (NextCstNo != ValueList.size())
+return Error("Invalid constant reference!");
+  
   return Stream.ReadBlockEnd();
 }
 
@@ -403,9 +440,48 @@
   else
 V = UndefValue::get(CurTy);
   break;
+  
+case bitc::CST_CODE_AGGREGATE: {// AGGREGATE: [n, n x value number]
+  if (Record.empty() || Record.size() < Record[0]+1)
+return Error("Invalid CST_AGGREGATE record");
+  
+  unsigned Size = Record[0];
+  std::vector Elts;
+  
+  if (const StructType *STy = dyn_cast(CurTy)) {
+for (unsigned i = 0; i != Size; ++i)
+  Elts.push_back(ValueList.getConstantFwdRef(Record[i+1],
+ STy->getElementType(i)));
+V = ConstantStruct::get(STy, Elts);
+  } else if (const ArrayType *ATy = dyn_cast(CurTy)) {
+const Type *EltTy = ATy->getElementType();
+for (unsigned i = 0; i != Size; ++i)
+  Elts.push_back(ValueList.getConstantFwdRef(Record[i+1], EltTy));
+V = ConstantArray::get(ATy, Elts);
+  } else if (const VectorType *VTy = dyn_cast(CurTy)) {
+const Type *EltTy = VTy->getElementType();
+for (unsigned i = 0; i != Size; ++i)
+  Elts.push_back(ValueList.getConstantFwdRef(Record[i+1], EltTy));
+V = ConstantVector::get(Elts);
+  } else {
+V = UndefValue::get(CurTy);
+  }
+}
+}
+
+if (NextCstNo == ValueList.size())
+  ValueList.push_back(V);
+else if (ValueList[NextCstNo] == 0)
+  ValueList.initVal(NextCstNo, V);
+else {
+  // If there was a forward reference to this constant, 
+  Value *OldV = ValueList[NextCstNo];
+  ValueList.setOperand(NextCstNo, V);
+  OldV->replaceAllUsesWith(V);
+  delete OldV;
 }
 
-ValueList.push_back(V);
+++NextCstNo;
   }
 }
 


Index: llvm/lib/Bitcode/Reader/BitcodeReader.h
diff -u llvm/lib/Bitcode/Reader/BitcodeReader.h:1.6 
llvm/lib/Bitcode/Reader/BitcodeReader.h:1.7
--- llvm/lib/Bitcode/Reader/BitcodeReader.h:1.6 Mon Apr 23 22:30:34 2007
+++ llvm/lib/Bitcode/Reader/BitcodeReader.h Tue Apr 24 00:48:56 2007
@@ -14,21 +14,48 @@
 #ifndef BITCODE_READER_H
 #define BITCODE_READER_H
 
-#include "llvm/Type.h"
 #include "llvm/ModuleProvider.h"
+#include "llvm/Type.h"
+#include "llvm/User.h"
 #include "llvm/Bitcode/LLVMBitCodes.h"
 #include 
 
 namespace llvm {
   class BitstreamReader;
-  class Value;
-  class GlobalVariable;
+  
+class BitcodeReaderValueList : public User {
+  std::vector Uses;
+public:
+  BitcodeReaderValueList() : User(Type::VoidTy, Value::ArgumentVal, 0, 0) {}
+  
+  // vector compatibility methods
+  unsigned size() const { return getNumOperands(); }
+  void push_back(

[llvm-commits] CVS: llvm/lib/Transforms/Scalar/LICM.cpp

2007-04-23 Thread Owen Anderson


Changes in directory llvm/lib/Transforms/Scalar:

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

Rollback some changes that adversely affected performance.  I'm currently 
rethinking
my approach to this, so hopefully I'll find a way to do this without making 
this slower.


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

 LICM.cpp |   48 ++--
 1 files changed, 26 insertions(+), 22 deletions(-)


Index: llvm/lib/Transforms/Scalar/LICM.cpp
diff -u llvm/lib/Transforms/Scalar/LICM.cpp:1.94 
llvm/lib/Transforms/Scalar/LICM.cpp:1.95
--- llvm/lib/Transforms/Scalar/LICM.cpp:1.94Sat Apr 21 02:11:47 2007
+++ llvm/lib/Transforms/Scalar/LICM.cpp Tue Apr 24 01:40:39 2007
@@ -72,6 +72,7 @@
   AU.setPreservesCFG();
   AU.addRequiredID(LoopSimplifyID);
   AU.addRequired();
+  AU.addRequired();
   AU.addRequired();
   AU.addRequired();  // For scalar promotion (mem2reg)
   AU.addRequired();
@@ -86,7 +87,8 @@
 // Various analyses that we use...
 AliasAnalysis *AA;   // Current AliasAnalysis information
 LoopInfo  *LI;   // Current LoopInfo
-ETForest *ET;   // ETForest for the current Loop...
+ETForest  *ET;   // ETForest for the current loop..
+DominatorTree *DT;   // Dominator Tree for the current Loop...
 DominanceFrontier *DF;   // Current Dominance Frontier
 
 // State that is updated as we process loops
@@ -98,19 +100,19 @@
 
 /// SinkRegion - Walk the specified region of the CFG (defined by all 
blocks
 /// dominated by the specified block, and that are in the current loop) in
-/// reverse depth first order w.r.t the ETForest.  This allows us to
+/// reverse depth first order w.r.t the DominatorTree.  This allows us to
 /// visit uses before definitions, allowing us to sink a loop body in one
 /// pass without iteration.
 ///
-void SinkRegion(BasicBlock *BB);
+void SinkRegion(DominatorTree::Node *N);
 
 /// HoistRegion - Walk the specified region of the CFG (defined by all
 /// blocks dominated by the specified block, and that are in the current
-/// loop) in depth first order w.r.t the ETForest.  This allows us to
+/// loop) in depth first order w.r.t the DominatorTree.  This allows us to
 /// visit definitions before uses, allowing us to hoist a loop body in one
 /// pass without iteration.
 ///
-void HoistRegion(BasicBlock *BB);
+void HoistRegion(DominatorTree::Node *N);
 
 /// inSubLoop - Little predicate that returns true if the specified basic
 /// block is in a subloop of the current one, not the current one itself.
@@ -135,20 +137,21 @@
   if (BlockInLoop == LoopHeader)
 return true;
 
-  BasicBlock *IDom = ExitBlock;
+  DominatorTree::Node *BlockInLoopNode = DT->getNode(BlockInLoop);
+  DominatorTree::Node *IDom= DT->getNode(ExitBlock);
 
   // Because the exit block is not in the loop, we know we have to get _at
   // least_ its immediate dominator.
   do {
 // Get next Immediate Dominator.
-IDom = ET->getIDom(IDom);
+IDom = IDom->getIDom();
 
 // If we have got to the header of the loop, then the instructions 
block
 // did not dominate the exit node, so we can't hoist it.
-if (IDom == LoopHeader)
+if (IDom->getBlock() == LoopHeader)
   return false;
 
-  } while (IDom != BlockInLoop);
+  } while (IDom != BlockInLoopNode);
 
   return true;
 }
@@ -212,6 +215,7 @@
   LI = &getAnalysis();
   AA = &getAnalysis();
   DF = &getAnalysis();
+  DT = &getAnalysis();
   ET = &getAnalysis();
 
   CurAST = new AliasSetTracker(*AA);
@@ -251,8 +255,8 @@
   // us to sink instructions in one pass, without iteration.  AFter sinking
   // instructions, we perform another pass to hoist them out of the loop.
   //
-  SinkRegion(L->getHeader());
-  HoistRegion(L->getHeader());
+  SinkRegion(DT->getNode(L->getHeader()));
+  HoistRegion(DT->getNode(L->getHeader()));
 
   // Now that all loop invariants have been removed from the loop, promote any
   // memory references to scalars that we can...
@@ -269,19 +273,19 @@
 
 /// SinkRegion - Walk the specified region of the CFG (defined by all blocks
 /// dominated by the specified block, and that are in the current loop) in
-/// reverse depth first order w.r.t the ETForest.  This allows us to visit
+/// reverse depth first order w.r.t the DominatorTree.  This allows us to visit
 /// uses before definitions, allowing us to sink a loop body in one pass 
without
 /// iteration.
 ///
-void LICM::SinkRegion(BasicBlock *BB) {
-  assert(BB != 0 && "Null sink block?");
+void LICM::SinkRegion(DominatorTree::Node *N) {
+  assert(N != 0 && "Null dominator tree node?");
+  BasicBlock *BB = N->getBlock();
 
   // If this subregion is not in the top level loop at all, exit.
   if (!CurLoop->contains(BB)) return;
 
   // We are processing blocks in reverse dfo, so pr