[llvm-commits] PR889 patch

Chris Lattner clattner at apple.com
Mon Nov 26 22:31:51 PST 2007


On Nov 26, 2007, at 4:46 AM, pawel kunio wrote:

> Hello,
> Please find attached the changelist for PR889. As suggested in
> bugzilla, I devirtualized the Value destructor, renamed the
> destructors of Value-inherited classes to static destroythis methods,
> added the code for type checking and destroythis scheduling to Value
> destructor.
> Currently i am not full-time available for this project but I will try
> to get some new tasks on llvmdev mailing list, as time allows.

Very nice work Pawel!

Some specific comments:

--- include/llvm/BasicBlock.h	(revision 44322)
+++ include/llvm/BasicBlock.h	(working copy)
@@ -76,7 +76,7 @@
    ///
    explicit BasicBlock(const std::string &Name = "", Function *Parent  
= 0,
                        BasicBlock *InsertBefore = 0);
-  ~BasicBlock();
+  static void destroythis(BasicBlock*);


Can this and other instances of 'destroyThis' be made private or  
protected?  I think only the ~Value() method should be public.  This  
may require making Value a friend of everything, but that is less  
confusing than having this as a public method.



Index: include/llvm/Constants.h
===================================================================
--- include/llvm/Constants.h	(revision 44322)
+++ include/llvm/Constants.h	(working copy)
@@ -24,6 +24,7 @@
  #include "llvm/Type.h"
  #include "llvm/ADT/APInt.h"
  #include "llvm/ADT/APFloat.h"
+#include "llvm/Instructions.h"


Please don't add this #include.  Instead, use forward declarations and  
move code that needs it out of line (I think that moving the  
GetElementPtrConstantExpr ctor out of line would be enough?)

+/// GetElementPtrConstantExpr - Helper class for Constants.cpp, and is
+/// used behind the scenes to implement getelementpr constant exprs.
+struct GetElementPtrConstantExpr : public ConstantExpr {
+  GetElementPtrConstantExpr(Constant *C, const std::vector<Constant*>  
&IdxList,
+                            const Type *DestTy)

Please define this as a 'class' and use "public" instead of a  
'struct'.  This improves compatibility with MSVC++.


--- include/llvm/InlineAsm.h	(revision 44322)
+++ include/llvm/InlineAsm.h	(working copy)
@@ -36,7 +36,8 @@

    InlineAsm(const FunctionType *Ty, const std::string &AsmString,
              const std::string &Constraints, bool hasSideEffects);
-  virtual ~InlineAsm();
+  //static void destroythis(InlineAsm*);
+  //friend Value;
  public:


Please remove :), like wise in UnaryInstruction.

+++ include/llvm/Value.h	(working copy)
@@ -64,14 +64,17 @@

    friend class ValueSymbolTable; // Allow ValueSymbolTable to  
directly mod Name.
    friend class SymbolTable;      // Allow SymbolTable to directly  
poke Name.
-  ValueName *Name;
+public:
+	ValueName *Name;


Why does this need to be public?  If it really needs to be public,  
please add a comment explaining why.  Also, please remove the tab.


+void ConstantArray::destroythis(ConstantArray*v)
+{
+  delete [] v->OperandList;
  }

Unlike destructors, we don't get free "Chaining" of destruction up  
through parent classes for free.  I think it would be better to  
explicitly model the class hierarchy here, with something like:

+void ConstantArray::destroythis(ConstantArray*v)
+{
+  delete [] v->OperandList;
    Constant::destroyThis(v);
  }

And implement destroyThis for every class (even if it's a trivial  
empty forwarding method that just calls destroyThis on its immediate  
parent class).  What do you think?

+Value::~Value()
+{
+	if(SubclassID == BasicBlockVal)
+	{
+		BasicBlock::destroythis((BasicBlock*)this);
+	}
+	else if(SubclassID == ConstantArrayVal)
+	{

Why not use a switch on subclassid?

+	else if(SubclassID == ConstantExprVal && ((ConstantExpr*)this)- 
 >SubclassData == Instruction::GetElementPtr)

I'd much prefer that this look like this:

     case ConstantExprVal:
       if (cast<ConstantExpr>(this)->getOpcode() ==  
Instruction::GetElementPtr)
         ...

+	else if(SubclassID >= InstructionVal)
+	{
+		if(SubclassID == InstructionVal + Instruction::Call)
+		{
+			CallInst::destroythis((CallInst*)this);
+		}
+		else if(SubclassID == InstructionVal + Instruction::PHI)


Likewise, this can be:

    default:
      if (CallInst *CI = dyn_cast<CallInst>(this))
        CallInst::destroyThis(CI);
      else if (PHINode *PN = dyn_cast<PHINode>(this))
        PHINode::destroyThis(PN);
       ..
      else
        Instruction::destroyThis(PN);

I really think it is cleaner if CallInst::destroyThis itself chains to  
Instruction::destroyThis, instead of having ~Value do it.

Thanks for tackling this project, it will be very nice to shrinkify  
everything!

-Chris


  



More information about the llvm-commits mailing list