[llvm-commits] [llvm] r65626 - in /llvm/trunk: include/llvm/ADT/ilist_node.h include/llvm/BasicBlock.h lib/VMCore/BasicBlock.cpp

Gabor Greif ggreif at gmail.com
Fri Feb 27 00:41:39 PST 2009


Author: ggreif
Date: Fri Feb 27 02:41:37 2009
New Revision: 65626

URL: http://llvm.org/viewvc/llvm-project?rev=65626&view=rev
Log:
Introduce a new technique for merging BasicBlock with Instruction sentinel by superposition.
This looks dangerous, but isn't because the sentinel is accessed in special way only,
namely the Next and Prev fields of it, and these are guaranteed to exist.

Modified:
    llvm/trunk/include/llvm/ADT/ilist_node.h
    llvm/trunk/include/llvm/BasicBlock.h
    llvm/trunk/lib/VMCore/BasicBlock.cpp

Modified: llvm/trunk/include/llvm/ADT/ilist_node.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ilist_node.h?rev=65626&r1=65625&r2=65626&view=diff

==============================================================================
--- llvm/trunk/include/llvm/ADT/ilist_node.h (original)
+++ llvm/trunk/include/llvm/ADT/ilist_node.h Fri Feb 27 02:41:37 2009
@@ -20,6 +20,9 @@
 template<typename NodeTy>
 struct ilist_nextprev_traits;
 
+template<typename NodeTy>
+struct ilist_traits;
+
 /// ilist_node - Base class that provides next/prev services for nodes
 /// that use ilist_nextprev_traits or ilist_default_traits.
 ///
@@ -36,6 +39,7 @@
   void setNext(NodeTy *N) { Next = N; }
 protected:
   ilist_node() : Prev(0), Next(0) {}
+  friend struct ilist_traits<NodeTy>;
 };
 
 } // End llvm namespace

Modified: llvm/trunk/include/llvm/BasicBlock.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/BasicBlock.h?rev=65626&r1=65625&r2=65626&view=diff

==============================================================================
--- llvm/trunk/include/llvm/BasicBlock.h (original)
+++ llvm/trunk/include/llvm/BasicBlock.h Fri Feb 27 02:41:37 2009
@@ -26,11 +26,15 @@
 template<> struct ilist_traits<Instruction>
   : public SymbolTableListTraits<Instruction, BasicBlock> {
   // createSentinel is used to create a node that marks the end of the list...
-  static Instruction *createSentinel();
-  static void destroySentinel(Instruction *I) { delete I; }
+  Instruction *createSentinel() const {
+    return const_cast<Instruction*>(static_cast<const Instruction*>(&Sentinel));
+  }
+  static void destroySentinel(Instruction *I) { }
   static iplist<Instruction> &getList(BasicBlock *BB);
   static ValueSymbolTable *getSymTab(BasicBlock *ItemParent);
   static int getListOffset();
+private:
+  ilist_node<Instruction> Sentinel;
 };
 
 /// This represents a single basic block in LLVM. A basic block is simply a
@@ -49,9 +53,10 @@
 /// @brief LLVM Basic Block Representation
 class BasicBlock : public Value, // Basic blocks are data objects also
                    public ilist_node<BasicBlock> {
+
 public:
   typedef iplist<Instruction> InstListType;
-private :
+private:
   InstListType InstList;
   Function *Parent;
 

Modified: llvm/trunk/lib/VMCore/BasicBlock.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/BasicBlock.cpp?rev=65626&r1=65625&r2=65626&view=diff

==============================================================================
--- llvm/trunk/lib/VMCore/BasicBlock.cpp (original)
+++ llvm/trunk/lib/VMCore/BasicBlock.cpp Fri Feb 27 02:41:37 2009
@@ -31,40 +31,6 @@
   return 0;
 }
 
-
-namespace {
-  /// DummyInst - An instance of this class is used to mark the end of the
-  /// instruction list.  This is not a real instruction.
-  struct VISIBILITY_HIDDEN DummyInst : public Instruction {
-    // allocate space for exactly zero operands
-    void *operator new(size_t s) {
-      return User::operator new(s, 0);
-    }
-    DummyInst() : Instruction(Type::VoidTy, OtherOpsEnd, 0, 0) {
-      // This should not be garbage monitored.
-      LeakDetector::removeGarbageObject(this);
-    }
-
-    Instruction *clone() const {
-      assert(0 && "Cannot clone EOL");abort();
-      return 0;
-    }
-    const char *getOpcodeName() const { return "*end-of-list-inst*"; }
-
-    // Methods for support type inquiry through isa, cast, and dyn_cast...
-    static inline bool classof(const DummyInst *) { return true; }
-    static inline bool classof(const Instruction *I) {
-      return I->getOpcode() == OtherOpsEnd;
-    }
-    static inline bool classof(const Value *V) {
-      return isa<Instruction>(V) && classof(cast<Instruction>(V));
-    }
-  };
-}
-
-Instruction *ilist_traits<Instruction>::createSentinel() {
-  return new DummyInst();
-}
 iplist<Instruction> &ilist_traits<Instruction>::getList(BasicBlock *BB) {
   return BB->getInstList();
 }





More information about the llvm-commits mailing list