summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
diff options
context:
space:
mode:
authorJeremy Morse <jeremy.morse.llvm@gmail.com>2018-11-28 17:58:45 +0000
committerJeremy Morse <jeremy.morse.llvm@gmail.com>2018-11-28 17:58:45 +0000
commit9b4cfa55b1b86e35b5ace5061606753d7060f1a7 (patch)
treee458ef594a9be9d18e6fff7488a7e9456ee0181d /llvm/lib/Transforms/Utils/SimplifyCFG.cpp
parent63d397ea6ec4eb239374af152f97ed1f053d22af (diff)
downloadbcm5719-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.cpp17
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
OpenPOWER on IntegriCloud