Skip to content

Commit

Permalink
Simplify blockaddress usage before giving up in MergeBlockIntoPredece…
Browse files Browse the repository at this point in the history
…ssor

Summary:
Simplify blockaddress usage before giving up in MergeBlockIntoPredecessor

This is a missing small optimization in MergeBlockIntoPredecessor.

This helps with one simplifycfg test which expects this case to be handled.

Reviewers: davide, spatel, brzycki, asbirlea

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D48284

llvm-svn: 334992
trentxintong committed Jun 18, 2018
1 parent d9c3c1c commit bfd8cfc
Showing 3 changed files with 37 additions and 5 deletions.
9 changes: 8 additions & 1 deletion llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
Original file line number Diff line number Diff line change
@@ -119,7 +119,14 @@ bool llvm::MergeBlockIntoPredecessor(BasicBlock *BB, DominatorTree *DT,
LoopInfo *LI,
MemoryDependenceResults *MemDep) {
// Don't merge away blocks who have their address taken.
if (BB->hasAddressTaken()) return false;
if (BB->hasAddressTaken()) {
// If the block has its address taken, it may be a tree of dead constants
// hanging off of it. These shouldn't keep the block alive.
BlockAddress *BA = BlockAddress::get(BB);
BA->removeDeadConstantUsers();
if (!BA->use_empty())
return false;
}

// Can't merge if there are multiple predecessors, or no predecessors.
BasicBlock *PredBB = BB->getUniquePredecessor();
Original file line number Diff line number Diff line change
@@ -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]
28 changes: 28 additions & 0 deletions llvm/unittests/Transforms/Utils/BasicBlockUtils.cpp
Original file line number Diff line number Diff line change
@@ -50,3 +50,31 @@ TEST(BasicBlockUtils, SplitBlockPredecessors) {
SplitBlockPredecessors(&F->getEntryBlock(), {}, "split.entry", &DT);
EXPECT_TRUE(DT.verify());
}

TEST(BasicBlockUtils, MergeBlockIntoPredecessor) {
LLVMContext C;
std::unique_ptr<Module> M = parseIR(C,
R"(
define i32 @f(i8* %str) {
entry:
%dead = extractvalue [1 x i8*] [ i8* blockaddress(@f, %L0) ], 0
br label %L0
L0:
ret i32 0
}
)");

// First remove the dead instruction to empty the usage of the constant
// containing blockaddress(@f, %L0)
Function *F = M->getFunction("f");
auto BBI = F->begin();
Instruction *DI = &*((*BBI).begin());
EXPECT_TRUE(DI->use_empty());
DI->eraseFromParent();

// Get L0 and make sure that it can be merged into entry block.
++BBI;
BasicBlock *BB = &(*BBI);
EXPECT_TRUE(MergeBlockIntoPredecessor(BB));
}

0 comments on commit bfd8cfc

Please sign in to comment.