diff options
author | Xin Tong <trent.xin.tong@gmail.com> | 2018-06-18 22:59:13 +0000 |
---|---|---|
committer | Xin Tong <trent.xin.tong@gmail.com> | 2018-06-18 22:59:13 +0000 |
commit | bfd8cfcb8dffbcf3b4ecdb5cad00d07fda4310f9 (patch) | |
tree | 4faa2fc4844a48e98aa3cce1ef287f9084f55def /llvm/unittests/Transforms/Utils | |
parent | d9c3c1cd9d7bf5e58e4bd1ae15701c921acee3f3 (diff) | |
download | bcm5719-llvm-bfd8cfcb8dffbcf3b4ecdb5cad00d07fda4310f9.tar.gz bcm5719-llvm-bfd8cfcb8dffbcf3b4ecdb5cad00d07fda4310f9.zip |
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
Diffstat (limited to 'llvm/unittests/Transforms/Utils')
-rw-r--r-- | llvm/unittests/Transforms/Utils/BasicBlockUtils.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
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<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)); +} |