summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/lib/IR/BasicBlock.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/llvm/lib/IR/BasicBlock.cpp')
-rw-r--r--gnu/llvm/lib/IR/BasicBlock.cpp16
1 files changed, 15 insertions, 1 deletions
diff --git a/gnu/llvm/lib/IR/BasicBlock.cpp b/gnu/llvm/lib/IR/BasicBlock.cpp
index 2b780adf6c6..938c40182b9 100644
--- a/gnu/llvm/lib/IR/BasicBlock.cpp
+++ b/gnu/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
@@ -447,3 +448,16 @@ bool BasicBlock::isLandingPad() const {
const LandingPadInst *BasicBlock::getLandingPadInst() const {
return dyn_cast<LandingPadInst>(getFirstNonPHI());
}
+
+Optional<uint64_t> BasicBlock::getIrrLoopHeaderWeight() const {
+ const TerminatorInst *TI = getTerminator();
+ if (MDNode *MDIrrLoopHeader =
+ TI->getMetadata(LLVMContext::MD_irr_loop)) {
+ MDString *MDName = cast<MDString>(MDIrrLoopHeader->getOperand(0));
+ if (MDName->getString().equals("loop_header_weight")) {
+ auto *CI = mdconst::extract<ConstantInt>(MDIrrLoopHeader->getOperand(1));
+ return Optional<uint64_t>(CI->getValue().getZExtValue());
+ }
+ }
+ return Optional<uint64_t>();
+}