if basic blocks are destroyed while there are *just* BlockAddress' hanging
authorChris Lattner <sabre@nondot.org>
Fri, 30 Oct 2009 22:39:36 +0000 (22:39 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 30 Oct 2009 22:39:36 +0000 (22:39 +0000)
around, then zap them.  This is analogous to dangling constantexprs hanging
off functions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@85627 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/BasicBlock.cpp
test/Transforms/SimplifyCFG/basictest.ll

index e8069c0f053276906987eaad8619e82f28fcae1f..23d0557dc7479203dc2242d4b00349a5d3a1deaa 100644 (file)
@@ -58,6 +58,24 @@ BasicBlock::BasicBlock(LLVMContext &C, const Twine &Name, Function *NewParent,
 
 
 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();
index 468b6ed11bc43caec85c7bc42e38e97455ee6543..a829e030e21d0f3216c6d32f73d68d7f9fa4828a 100644 (file)
@@ -21,5 +21,10 @@ BB1:            ; preds = %0, %0
 }
 
 
-
-
+define void @test4() {
+entry:
+ br label %return
+return:
+ ret void
+}
+@test4g = global i8* blockaddress(@test4, %return)