Index: llvm/trunk/lib/Transforms/Utils/Local.cpp =================================================================== --- llvm/trunk/lib/Transforms/Utils/Local.cpp +++ llvm/trunk/lib/Transforms/Utils/Local.cpp @@ -324,8 +324,14 @@ Value *Address = IBI->getAddress(); IBI->eraseFromParent(); if (DeleteDeadConditions) + // Delete pointer cast instructions. RecursivelyDeleteTriviallyDeadInstructions(Address, TLI); + // Also zap the blockaddress constant if there are no users remaining, + // otherwise the destination is still marked as having its address taken. + if (BA->use_empty()) + BA->destroyConstant(); + // If we didn't find our destination in the IBI successor list, then we // have undefined behavior. Replace the unconditional branch with an // 'unreachable' instruction. Index: llvm/trunk/test/Transforms/SimplifyCFG/dce-cond-after-folding-terminator.ll =================================================================== --- llvm/trunk/test/Transforms/SimplifyCFG/dce-cond-after-folding-terminator.ll +++ llvm/trunk/test/Transforms/SimplifyCFG/dce-cond-after-folding-terminator.ll @@ -37,10 +37,7 @@ entry: ; CHECK-LABEL: @test_indirectbr( ; CHECK-NEXT: entry: -; Ideally this should now check: -; CHK-NEXT: ret void -; But that doesn't happen yet. Instead: -; CHECK-NEXT: br label %L1 +; CHECK-NEXT: ret void %label = bitcast i8* blockaddress(@test_indirectbr, %L1) to i8* indirectbr i8* %label, [label %L1, label %L2]