diff options
author | Jeremy Morse <jeremy.morse.llvm@gmail.com> | 2018-11-28 17:58:45 +0000 |
---|---|---|
committer | Jeremy Morse <jeremy.morse.llvm@gmail.com> | 2018-11-28 17:58:45 +0000 |
commit | 9b4cfa55b1b86e35b5ace5061606753d7060f1a7 (patch) | |
tree | e458ef594a9be9d18e6fff7488a7e9456ee0181d /llvm/lib/Transforms/Utils/SimplifyCFG.cpp | |
parent | 63d397ea6ec4eb239374af152f97ed1f053d22af (diff) | |
download | bcm5719-llvm-9b4cfa55b1b86e35b5ace5061606753d7060f1a7.tar.gz bcm5719-llvm-9b4cfa55b1b86e35b5ace5061606753d7060f1a7.zip |
[DebugInfo] Give inlinable calls DILocs (PR39807)
In PR39807 we incorrectly handle circumstances where calls are common'd
from conditional blocks into the parent BB. Calls that can be inlined
must always have DebugLocs, however we strip them during commoning, which
the IR verifier asserts on.
Fix this by using applyMergedLocation: it will perform the same DebugLoc
stripping of conditional Locs, but will also generate an unknown location
DebugLoc that satisfies the requirement for inlinable calls to always have
locations.
Some of the prior logic for selecting a DebugLoc is now likely redundant;
I'll generate a follow-up to remove it (involves editing more regression
tests).
Differential Revision: https://reviews.llvm.org/D54997
llvm-svn: 347782
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyCFG.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index cbf9fc16c3d..ef5f750df1e 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -1375,7 +1375,7 @@ HoistTerminator: // As the parent basic block terminator is a branch instruction which is // removed at the end of the current transformation, use its previous // non-debug instruction, as the reference insertion point, which will - // provide the debug location for the instruction being hoisted. For BBs + // provide the debug location for generated select instructions. For BBs // with only debug instructions, use an empty debug location. Instruction *InsertPt = BIParent->getTerminator()->getPrevNonDebugInstruction(); @@ -1389,15 +1389,16 @@ HoistTerminator: NT->takeName(I1); } - // The instruction NT being hoisted, is the terminator for the true branch, - // with debug location (DILocation) within that branch. We can't retain - // its original debug location value, otherwise 'select' instructions that - // are created from any PHI nodes, will take its debug location, giving - // the impression that those 'select' instructions are in the true branch, - // causing incorrect stepping, affecting the debug experience. - NT->setDebugLoc(InsertPt ? InsertPt->getDebugLoc() : DebugLoc()); + // Ensure terminator gets a debug location, even an unknown one, in case + // it involves inlinable calls. + NT->applyMergedLocation(I1->getDebugLoc(), I2->getDebugLoc()); IRBuilder<NoFolder> Builder(NT); + // If an earlier instruction in this BB had a location, adopt it, otherwise + // clear debug locations. + Builder.SetCurrentDebugLocation(InsertPt ? InsertPt->getDebugLoc() + : DebugLoc()); + // Hoisting one of the terminators from our successor is a great thing. // Unfortunately, the successors of the if/else blocks may have PHI nodes in // them. If they do, all PHI entries for BB1/BB2 must agree for all PHI |