[llvm-commits] updated patch for PR889

Chris Lattner clattner at apple.com
Wed Nov 28 21:09:49 PST 2007


On Nov 28, 2007, at 12:55 PM, pawel kunio wrote:

> Hello,
> Here comes updated patch for PR889 with all the changes suggested by
> Chris applied to the source. I was just wondering
> whether the dynamic casts wont impose too much of burden
> performance-wise compared to checking the SubClassID,
> possible open thing for checking the types in Value destructor
> (applies to Instruction inherited classes only).

cast<foo>() is a free conversion.  It does a check in an assert build  
(which isn't free) but no check in a non-assert build.     
dyn_cast<foo>() does a check in every build, but the check just looks  
at the subclassid, so it's equivalent to doing a comparison on  
subclassid then a C cast (so yeah, it's efficient :)

The patch is looking good, but there are a couple of minor issues:

+  case ConstantExprVal:
+    if(cast<ConstantExpr>(this)->getOpcode() ==  
Instruction::GetElementPtr)
+       
GetElementPtrConstantExpr 
::destroyThis(cast<GetElementPtrConstantExpr>(this));
+    else if(cast<ConstantExpr>(this)->getOpcode() ==  
Instruction::ExtractElement)
+       
ExtractElementConstantExpr 
::destroyThis(cast<ExtractElementConstantExpr>(this));
+    else if(cast<ConstantExpr>(this)->getOpcode() ==  
Instruction::InsertElement)
+       
InsertElementConstantExpr 
::destroyThis(cast<InsertElementConstantExpr>(this));
+    else if(cast<ConstantExpr>(this)->getOpcode() ==  
Instruction::Select)
+      SelectConstantExpr::destroyThis(cast<SelectConstantExpr>(this));
+    else if(cast<ConstantExpr>(this)->getOpcode() ==  
Instruction::ShuffleVector)
+       
ShuffleVectorConstantExpr 
::destroyThis(cast<ShuffleVectorConstantExpr>(this));

Please make this fit in 80 columns, for example, by doing:

+  case ConstantExprVal: {
      const ConstantExpr *CE = cast<ConstantExpr>(this);
+    if(CE->getOpcode() == Instruction::GetElementPtr)
+       
GetElementPtrConstantExpr 
::destroyThis(cast<GetElementPtrConstantExpr>(CE));
+    else if(CE->getOpcode() == Instruction::ExtractElement)
+       
ExtractElementConstantExpr 
::destroyThis(cast<ExtractElementConstantExpr>(CE));
    ...


+		else if(BinaryConstantExpr* BCE = dyn_cast<BinaryConstantExpr>(this))
+      BinaryConstantExpr::destroyThis(BCE);
+		else if(UnaryConstantExpr* UCE = dyn_cast<UnaryConstantExpr>(this))
+      UnaryConstantExpr::destroyThis(UCE);
+		else if(CompareConstantExpr* CCE =  
dyn_cast<CompareConstantExpr>(this))
+      CompareConstantExpr::destroyThis(CCE);

It looks like some tabs snuck in here.


+  default:
+    if (BinaryOperator *BO = dyn_cast<BinaryOperator>(this))
+      BinaryOperator::destroyThis(BO);
+    else if (CallInst *CI = dyn_cast<CallInst>(this))
+    {
+			if(IntrinsicInst* II = dyn_cast<IntrinsicInst>(this))
+			{
+				if(DbgInfoIntrinsic* DII = dyn_cast<DbgInfoIntrinsic>(this))
+				{
+					if(DbgDeclareInst* DDI = dyn_cast<DbgDeclareInst>(this))
+            DbgDeclareInst::destroyThis(DDI);
+					else if(DbgFuncStartInst* DFSI = dyn_cast<DbgFuncStartInst>(this))
+            DbgFuncStartInst::destroyThis(DFSI);
+					else if(DbgRegionEndInst* DREI = dyn_cast<DbgRegionEndInst>(this))
+            DbgRegionEndInst::destroyThis(DREI);
+					else if(DbgRegionStartInst* DRSI =  
dyn_cast<DbgRegionStartInst>(this))
+            DbgRegionStartInst::destroyThis(DRSI);


Likewise, more tabs.


+    else if (CmpInst *CI = dyn_cast<CmpInst>(this))
+    {
+      if (FCmpInst *FCI = dyn_cast<FCmpInst>(this))
+        FCmpInst::destroyThis(FCI);
+      else if (ICmpInst *ICI = dyn_cast<ICmpInst>(this))
+        ICmpInst::destroyThis(ICI);
+      else
+        CmpInst::destroyThis(CI);


This pattern occurs frequently, with different classes.  This should  
only have to handle concrete classes, so I'd prefer that you write  
this like:

+    else if (CmpInst *CI = dyn_cast<CmpInst>(this))
+    {
+      if (FCmpInst *FCI = dyn_cast<FCmpInst>(this))
+        FCmpInst::destroyThis(FCI);
+      else if (ICmpInst *ICI = dyn_cast<ICmpInst>(this))
+        ICmpInst::destroyThis(ICI);
+      else
+        assert(0 && "Unknown compare instruction");

or better yet:

+    else if (CmpInst *CI = dyn_cast<CmpInst>(this))
+    {
+      if (FCmpInst *FCI = dyn_cast<FCmpInst>(this))
+        FCmpInst::destroyThis(FCI);
+      else
+        ICmpInst::destroyThis(cast<ICmpInst>(this));

which makes it obvious that the only sort of CmpInst is a FCmpInst or  
ICmpInst.



+#if 0
+  else if(isa<User>(this))
+	{


Please remove the #if 0 code.

Otherwise, it looks great!

-Chris





More information about the llvm-commits mailing list