mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-21 03:37:47 +00:00
Adds the loop end location to the loop metadata.
This additional information can be used to improve the locations when generating remarks for loops. Patch by Florian Hahn. Differential Revision: https://reviews.llvm.org/D25763 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286227 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
20b341aa05
commit
0a1b0ce7cf
@ -367,6 +367,27 @@ extern template class LoopBase<BasicBlock, Loop>;
|
||||
/// in the CFG are neccessarily loops.
|
||||
class Loop : public LoopBase<BasicBlock, Loop> {
|
||||
public:
|
||||
/// \brief A range representing the start and end location of a loop.
|
||||
class LocRange {
|
||||
DebugLoc Start;
|
||||
DebugLoc End;
|
||||
|
||||
public:
|
||||
LocRange() {}
|
||||
LocRange(DebugLoc Start) : Start(std::move(Start)), End(std::move(Start)) {}
|
||||
LocRange(DebugLoc Start, DebugLoc End) : Start(std::move(Start)),
|
||||
End(std::move(End)) {}
|
||||
|
||||
const DebugLoc &getStart() const { return Start; }
|
||||
const DebugLoc &getEnd() const { return End; }
|
||||
|
||||
/// \brief Check for null.
|
||||
///
|
||||
explicit operator bool() const {
|
||||
return Start && End;
|
||||
}
|
||||
};
|
||||
|
||||
Loop() {}
|
||||
|
||||
/// Return true if the specified value is loop invariant.
|
||||
@ -474,6 +495,9 @@ public:
|
||||
/// it returns an unknown location.
|
||||
DebugLoc getStartLoc() const;
|
||||
|
||||
/// Return the source code span of the loop.
|
||||
LocRange getLocRange() const;
|
||||
|
||||
StringRef getName() const {
|
||||
if (BasicBlock *Header = getHeader())
|
||||
if (Header->hasName())
|
||||
|
@ -305,23 +305,40 @@ bool Loop::isAnnotatedParallel() const {
|
||||
}
|
||||
|
||||
DebugLoc Loop::getStartLoc() const {
|
||||
return getLocRange().getStart();
|
||||
}
|
||||
|
||||
Loop::LocRange Loop::getLocRange() const {
|
||||
// If we have a debug location in the loop ID, then use it.
|
||||
if (MDNode *LoopID = getLoopID())
|
||||
for (unsigned i = 1, ie = LoopID->getNumOperands(); i < ie; ++i)
|
||||
if (DILocation *L = dyn_cast<DILocation>(LoopID->getOperand(i)))
|
||||
return DebugLoc(L);
|
||||
if (MDNode *LoopID = getLoopID()) {
|
||||
DebugLoc Start;
|
||||
// We use the first DebugLoc in the header as the start location of the loop
|
||||
// and if there is a second DebugLoc in the header we use it as end location
|
||||
// of the loop.
|
||||
for (unsigned i = 1, ie = LoopID->getNumOperands(); i < ie; ++i) {
|
||||
if (DILocation *L = dyn_cast<DILocation>(LoopID->getOperand(i))) {
|
||||
if (!Start)
|
||||
Start = DebugLoc(L);
|
||||
else
|
||||
return LocRange(Start, DebugLoc(L));
|
||||
}
|
||||
}
|
||||
|
||||
if (Start)
|
||||
return LocRange(Start);
|
||||
}
|
||||
|
||||
// Try the pre-header first.
|
||||
if (BasicBlock *PHeadBB = getLoopPreheader())
|
||||
if (DebugLoc DL = PHeadBB->getTerminator()->getDebugLoc())
|
||||
return DL;
|
||||
return LocRange(DL);
|
||||
|
||||
// If we have no pre-header or there are no instructions with debug
|
||||
// info in it, try the header.
|
||||
if (BasicBlock *HeadBB = getHeader())
|
||||
return HeadBB->getTerminator()->getDebugLoc();
|
||||
return LocRange(HeadBB->getTerminator()->getDebugLoc());
|
||||
|
||||
return DebugLoc();
|
||||
return LocRange();
|
||||
}
|
||||
|
||||
bool Loop::hasDedicatedExits() const {
|
||||
|
Loading…
x
Reference in New Issue
Block a user