From 0a7faa4e3d9ff9f8eebc8be6a85123c5e5f50103 Mon Sep 17 00:00:00 2001 From: Florian Hahn Date: Sat, 20 Jul 2019 12:25:47 +0000 Subject: [PATCH] [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 --- llvm/lib/Transforms/Utils/Local.cpp | 6 ++++++ .../SimplifyCFG/dce-cond-after-folding-terminator.ll | 5 +---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index 39b6b889f91c..c2d4303ecb09 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 036a615e7ff0..9c414b488373 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]