forked from OSchip/llvm-project
[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
This commit is contained in:
parent
cbd28cd05b
commit
0a7faa4e3d
|
@ -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.
|
||||
|
|
|
@ -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]
|
||||
|
|
Loading…
Reference in New Issue