[llvm-commits] [llvm] r85627 - in /llvm/trunk: lib/VMCore/BasicBlock.cpp test/Transforms/SimplifyCFG/basictest.ll

Chris Lattner sabre at nondot.org
Fri Oct 30 15:39:36 PDT 2009


Author: lattner
Date: Fri Oct 30 17:39:36 2009
New Revision: 85627

URL: http://llvm.org/viewvc/llvm-project?rev=85627&view=rev
Log:
if basic blocks are destroyed while there are *just* BlockAddress' hanging 
around, then zap them.  This is analogous to dangling constantexprs hanging
off functions.

Modified:
    llvm/trunk/lib/VMCore/BasicBlock.cpp
    llvm/trunk/test/Transforms/SimplifyCFG/basictest.ll

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

==============================================================================
--- llvm/trunk/lib/VMCore/BasicBlock.cpp (original)
+++ llvm/trunk/lib/VMCore/BasicBlock.cpp Fri Oct 30 17:39:36 2009
@@ -58,6 +58,24 @@
 
 
 BasicBlock::~BasicBlock() {
+  // If the address of the block is taken and it is being deleted (e.g. because
+  // it is dead), this means that there is either a dangling constant expr
+  // hanging off the block, or an undefined use of the block (source code
+  // expecting the address of a label to keep the block alive even though there
+  // is no indirect branch).  Handle these cases by zapping the BlockAddress
+  // nodes.  There are no other possible uses at this point.
+  if (hasAddressTaken()) {
+    assert(!use_empty() && "There should be at least one blockaddress!");
+    Constant *Replacement =
+      ConstantInt::get(llvm::Type::getInt32Ty(getContext()), 1);
+    while (!use_empty()) {
+      BlockAddress *BA = cast<BlockAddress>(use_back());
+      BA->replaceAllUsesWith(ConstantExpr::getIntToPtr(Replacement,
+                                                       BA->getType()));
+      BA->destroyConstant();
+    }
+  }
+  
   assert(getParent() == 0 && "BasicBlock still linked into the program!");
   dropAllReferences();
   InstList.clear();

Modified: llvm/trunk/test/Transforms/SimplifyCFG/basictest.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyCFG/basictest.ll?rev=85627&r1=85626&r2=85627&view=diff

==============================================================================
--- llvm/trunk/test/Transforms/SimplifyCFG/basictest.ll (original)
+++ llvm/trunk/test/Transforms/SimplifyCFG/basictest.ll Fri Oct 30 17:39:36 2009
@@ -21,5 +21,10 @@
 }
 
 
-
-
+define void @test4() {
+entry:
+ br label %return
+return:
+ ret void
+}
+ at test4g = global i8* blockaddress(@test4, %return)





More information about the llvm-commits mailing list