diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2017-12-29 19:25:53 +0000 |
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2017-12-29 19:25:53 +0000 |
| commit | 344c09202b0450c696da6950a59775d2ee96f28d (patch) | |
| tree | 635387f60ab3bde31e7c9ca00120bc734e99f40b | |
| parent | d41feef40f5fa4e7bdb77adea7c856157758db15 (diff) | |
| download | bcm5719-llvm-344c09202b0450c696da6950a59775d2ee96f28d.tar.gz bcm5719-llvm-344c09202b0450c696da6950a59775d2ee96f28d.zip | |
IR: Fix BasicBlock::phis for empty blocks
llvm-svn: 321567
| -rw-r--r-- | llvm/lib/IR/BasicBlock.cpp | 3 | ||||
| -rw-r--r-- | llvm/unittests/IR/BasicBlockTest.cpp | 6 |
2 files changed, 8 insertions, 1 deletions
diff --git a/llvm/lib/IR/BasicBlock.cpp b/llvm/lib/IR/BasicBlock.cpp index 22513924a96..938c40182b9 100644 --- a/llvm/lib/IR/BasicBlock.cpp +++ b/llvm/lib/IR/BasicBlock.cpp @@ -264,7 +264,8 @@ const BasicBlock *BasicBlock::getUniqueSuccessor() const { } iterator_range<BasicBlock::phi_iterator> BasicBlock::phis() { - return make_range<phi_iterator>(dyn_cast<PHINode>(&front()), nullptr); + PHINode *P = empty() ? nullptr : dyn_cast<PHINode>(&*begin()); + return make_range<phi_iterator>(P, nullptr); } /// This method is used to notify a BasicBlock that the diff --git a/llvm/unittests/IR/BasicBlockTest.cpp b/llvm/unittests/IR/BasicBlockTest.cpp index f1777e35b82..08a41ff3693 100644 --- a/llvm/unittests/IR/BasicBlockTest.cpp +++ b/llvm/unittests/IR/BasicBlockTest.cpp @@ -33,6 +33,12 @@ TEST(BasicBlockTest, PhiRange) { std::unique_ptr<BasicBlock> BB2(BasicBlock::Create(Context)); BranchInst::Create(BB.get(), BB2.get()); + // Make sure this doesn't crash if there are no phis. + for (auto &PN : BB->phis()) { + (void)PN; + EXPECT_TRUE(false) << "empty block should have no phis"; + } + // Make it a cycle. auto *BI = BranchInst::Create(BB.get(), BB.get()); |

