diff options
Diffstat (limited to 'gnu/llvm/lib/IR/BasicBlock.cpp')
| -rw-r--r-- | gnu/llvm/lib/IR/BasicBlock.cpp | 16 |
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>(); +} |
