aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/CodeGen/SelectionDAG/FastISel.cpp22
-rw-r--r--lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp2
2 files changed, 24 insertions, 0 deletions
diff --git a/lib/CodeGen/SelectionDAG/FastISel.cpp b/lib/CodeGen/SelectionDAG/FastISel.cpp
index 8ae75f5649..a7d629e6dc 100644
--- a/lib/CodeGen/SelectionDAG/FastISel.cpp
+++ b/lib/CodeGen/SelectionDAG/FastISel.cpp
@@ -292,6 +292,28 @@ void FastISel::recomputeInsertPt() {
++FuncInfo.InsertPt;
}
+/// recomputeDebugLocForMaterializedRegs - Recompute debug location for
+/// very first instruction in a basic block. All instructions emitted
+/// to materialize registers do not have location information, see
+/// enterLocalValueArea(), becase they may not be emited at the right
+/// location.
+void FastISel::recomputeDebugLocForMaterializedRegs() {
+ if (!getLastLocalValue())
+ return;
+ MachineInstr *First = FuncInfo.MBB->getFirstNonPHI();
+ if (!First->getDebugLoc().isUnknown())
+ return;
+
+ for (MachineBasicBlock::iterator I = FuncInfo.MBB->begin(),
+ E = FuncInfo.MBB->end(); I != E; ++I) {
+ DebugLoc DL = I->getDebugLoc();
+ if (!DL.isUnknown()) {
+ First->setDebugLoc(DL);
+ return;
+ }
+ }
+}
+
FastISel::SavePoint FastISel::enterLocalValueArea() {
MachineBasicBlock::iterator OldInsertPt = FuncInfo.InsertPt;
DebugLoc OldDL = DL;
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index dc8044b7a7..7a9439f4d5 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
@@ -964,6 +964,8 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
else
++NumFastIselBlocks;
+ if (FastIS)
+ FastIS->recomputeDebugLocForMaterializedRegs();
if (Begin != BI) {
// Run SelectionDAG instruction selection on the remainder of the block
// not handled by FastISel. If FastISel is not run, this is the entire