From bfd8cfcb8dffbcf3b4ecdb5cad00d07fda4310f9 Mon Sep 17 00:00:00 2001 From: Xin Tong Date: Mon, 18 Jun 2018 22:59:13 +0000 Subject: Simplify blockaddress usage before giving up in MergeBlockIntoPredecessor 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 --- .../unittests/Transforms/Utils/BasicBlockUtils.cpp | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'llvm/unittests/Transforms/Utils/BasicBlockUtils.cpp') diff --git a/llvm/unittests/Transforms/Utils/BasicBlockUtils.cpp b/llvm/unittests/Transforms/Utils/BasicBlockUtils.cpp index 2d0a9302011..590e7f6ada6 100644 --- a/llvm/unittests/Transforms/Utils/BasicBlockUtils.cpp +++ b/llvm/unittests/Transforms/Utils/BasicBlockUtils.cpp @@ -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 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)); +} -- cgit v1.2.3