forked from OSchip/llvm-project
[Debug] Add a utility to propagate dbg.value to new PHIs, NFC
This simply moves an existing utility to Utils for reuse. Split out of: https://reviews.llvm.org/D42551 Patch by Matt Davis! llvm-svn: 323471
This commit is contained in:
parent
31475a039a
commit
6bfc869cf7
|
@ -339,6 +339,10 @@ void ConvertDebugDeclareToDebugValue(DbgInfoIntrinsic *DII,
|
|||
/// llvm.dbg.value intrinsics.
|
||||
bool LowerDbgDeclare(Function &F);
|
||||
|
||||
/// Propagate dbg.value intrinsics through the newly inserted PHIs.
|
||||
void insertDebugValuesForPHIs(BasicBlock *BB,
|
||||
SmallVectorImpl<PHINode *> &InsertedPHIs);
|
||||
|
||||
/// Finds all intrinsics declaring local variables as living in the memory that
|
||||
/// 'V' points to. This may include a mix of dbg.declare and
|
||||
/// dbg.addr intrinsics.
|
||||
|
|
|
@ -169,38 +169,6 @@ static void RewriteUsesOfClonedInstructions(BasicBlock *OrigHeader,
|
|||
}
|
||||
}
|
||||
|
||||
/// Propagate dbg.value intrinsics through the newly inserted Phis.
|
||||
static void insertDebugValues(BasicBlock *OrigHeader,
|
||||
SmallVectorImpl<PHINode*> &InsertedPHIs) {
|
||||
ValueToValueMapTy DbgValueMap;
|
||||
|
||||
// Map existing PHI nodes to their dbg.values.
|
||||
for (auto &I : *OrigHeader) {
|
||||
if (auto DbgII = dyn_cast<DbgInfoIntrinsic>(&I)) {
|
||||
if (auto *Loc = dyn_cast_or_null<PHINode>(DbgII->getVariableLocation()))
|
||||
DbgValueMap.insert({Loc, DbgII});
|
||||
}
|
||||
}
|
||||
|
||||
// Then iterate through the new PHIs and look to see if they use one of the
|
||||
// previously mapped PHIs. If so, insert a new dbg.value intrinsic that will
|
||||
// propagate the info through the new PHI.
|
||||
LLVMContext &C = OrigHeader->getContext();
|
||||
for (auto PHI : InsertedPHIs) {
|
||||
for (auto VI : PHI->operand_values()) {
|
||||
auto V = DbgValueMap.find(VI);
|
||||
if (V != DbgValueMap.end()) {
|
||||
auto *DbgII = cast<DbgInfoIntrinsic>(V->second);
|
||||
Instruction *NewDbgII = DbgII->clone();
|
||||
auto PhiMAV = MetadataAsValue::get(C, ValueAsMetadata::get(PHI));
|
||||
NewDbgII->setOperand(0, PhiMAV);
|
||||
BasicBlock *Parent = PHI->getParent();
|
||||
NewDbgII->insertBefore(Parent->getFirstNonPHIOrDbgOrLifetime());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Rotate loop LP. Return true if the loop is rotated.
|
||||
///
|
||||
/// \param SimplifiedLatch is true if the latch was just folded into the final
|
||||
|
@ -405,7 +373,7 @@ bool LoopRotate::rotateLoop(Loop *L, bool SimplifiedLatch) {
|
|||
// previously had debug metadata attached. This keeps the debug info
|
||||
// up-to-date in the loop body.
|
||||
if (!InsertedPHIs.empty())
|
||||
insertDebugValues(OrigHeader, InsertedPHIs);
|
||||
insertDebugValuesForPHIs(OrigHeader, InsertedPHIs);
|
||||
|
||||
// NewHeader is now the header of the loop.
|
||||
L->moveToHeader(NewHeader);
|
||||
|
|
|
@ -73,6 +73,7 @@
|
|||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/KnownBits.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Transforms/Utils/ValueMapper.h"
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <climits>
|
||||
|
@ -1341,6 +1342,43 @@ bool llvm::LowerDbgDeclare(Function &F) {
|
|||
return true;
|
||||
}
|
||||
|
||||
/// Propagate dbg.value intrinsics through the newly inserted PHIs.
|
||||
void llvm::insertDebugValuesForPHIs(BasicBlock *BB,
|
||||
SmallVectorImpl<PHINode *> &InsertedPHIs) {
|
||||
assert(BB && "No BasicBlock to clone dbg.value(s) from.");
|
||||
if (InsertedPHIs.size() == 0)
|
||||
return;
|
||||
|
||||
// Map existing PHI nodes to their dbg.values.
|
||||
ValueToValueMapTy DbgValueMap;
|
||||
for (auto &I : *BB) {
|
||||
if (auto DbgII = dyn_cast<DbgInfoIntrinsic>(&I)) {
|
||||
if (auto *Loc = dyn_cast_or_null<PHINode>(DbgII->getVariableLocation()))
|
||||
DbgValueMap.insert({Loc, DbgII});
|
||||
}
|
||||
}
|
||||
if (DbgValueMap.size() == 0)
|
||||
return;
|
||||
|
||||
// Then iterate through the new PHIs and look to see if they use one of the
|
||||
// previously mapped PHIs. If so, insert a new dbg.value intrinsic that will
|
||||
// propagate the info through the new PHI.
|
||||
LLVMContext &C = BB->getContext();
|
||||
for (auto PHI : InsertedPHIs) {
|
||||
for (auto VI : PHI->operand_values()) {
|
||||
auto V = DbgValueMap.find(VI);
|
||||
if (V != DbgValueMap.end()) {
|
||||
auto *DbgII = cast<DbgInfoIntrinsic>(V->second);
|
||||
Instruction *NewDbgII = DbgII->clone();
|
||||
auto PhiMAV = MetadataAsValue::get(C, ValueAsMetadata::get(PHI));
|
||||
NewDbgII->setOperand(0, PhiMAV);
|
||||
BasicBlock *Parent = PHI->getParent();
|
||||
NewDbgII->insertBefore(Parent->getFirstNonPHIOrDbgOrLifetime());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Finds all intrinsics declaring local variables as living in the memory that
|
||||
/// 'V' points to. This may include a mix of dbg.declare and
|
||||
/// dbg.addr intrinsics.
|
||||
|
|
Loading…
Reference in New Issue