From: Florian Hahn Date: Sat, 20 Jul 2019 12:25:47 +0000 (+0000) Subject: [Local] Zap blockaddress without users in ConstantFoldTerminator. X-Git-Tag: llvmorg-11-init~13925 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0a7faa4e3d9ff9f8eebc8be6a85123c5e5f50103;p=platform%2Fupstream%2Fllvm.git [Local] Zap blockaddress without users in ConstantFoldTerminator. If the blockaddress is not destoryed, the destination block will still be marked as having its address taken, limiting further transformations. I think there are other places where the dead blockaddress constants are kept around, I'll look into that as follow up. Reviewers: craig.topper, brzycki, davide Reviewed By: brzycki, davide Differential Revision: https://reviews.llvm.org/D64936 llvm-svn: 366633 --- diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index 39b6b88..c2d4303 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -324,8 +324,14 @@ bool llvm::ConstantFoldTerminator(BasicBlock *BB, bool DeleteDeadConditions, 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. diff --git a/llvm/test/Transforms/SimplifyCFG/dce-cond-after-folding-terminator.ll b/llvm/test/Transforms/SimplifyCFG/dce-cond-after-folding-terminator.ll index 036a615..9c414b4 100644 --- a/llvm/test/Transforms/SimplifyCFG/dce-cond-after-folding-terminator.ll +++ b/llvm/test/Transforms/SimplifyCFG/dce-cond-after-folding-terminator.ll @@ -37,10 +37,7 @@ define void @test_indirectbr(i32 %x) { 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]