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 | f976cf4cca0794267f28b54e468007fd476d37d9 (patch) | |
tree | 8d746b455518a24fb84d55c5aec8ed8906784d88 /unittests/Transforms/Utils | |
parent | 6368868d2ebdb1393a3adc5a464de2d944390e4c (diff) |
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
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334992 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'unittests/Transforms/Utils')
-rw-r--r-- | unittests/Transforms/Utils/BasicBlockUtils.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/unittests/Transforms/Utils/BasicBlockUtils.cpp b/unittests/Transforms/Utils/BasicBlockUtils.cpp index 2d0a9302011..590e7f6ada6 100644 --- a/unittests/Transforms/Utils/BasicBlockUtils.cpp +++ b/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)); +} |