Skip to content

Commit

Permalink
[Local] Zap blockaddress without users in ConstantFoldTerminator.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
fhahn committed Jul 20, 2019
1 parent cbd28cd commit 0a7faa4
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 4 deletions.
6 changes: 6 additions & 0 deletions llvm/lib/Transforms/Utils/Local.cpp
Expand Up @@ -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.
Expand Down
Expand Up @@ -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]
Expand Down

0 comments on commit 0a7faa4

Please sign in to comment.