Skip to content

Commit 01ab5f6

Browse files
Handle llvm.dbg.values in SROA.
This patch properly handles llvm.dbg.values in SROA by making sure that any llvm.dbg.values get moved to before a storejust like llvm.dbg.declares do, or the llvm.dbg.value is correctly updated with the right alloca after an aggregate alloca is broken up.
1 parent dc11e03 commit 01ab5f6

File tree

6 files changed

+667
-382
lines changed

6 files changed

+667
-382
lines changed

llvm/lib/Transforms/Scalar/SROA.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5045,10 +5045,20 @@ static void insertNewDbgInst(DIBuilder &DIB, DbgVariableRecord *Orig,
50455045
BeforeInst->getIterator());
50465046
return;
50475047
}
5048+
5049+
if (Orig->isDbgValue()) {
5050+
DbgVariableRecord *DVR = DbgVariableRecord::createDbgVariableRecord(
5051+
NewAddr, Orig->getVariable(), NewFragmentExpr, Orig->getDebugLoc());
5052+
BeforeInst->getParent()->insertDbgRecordBefore(DVR,
5053+
BeforeInst->getIterator());
5054+
return;
5055+
}
5056+
50485057
if (!NewAddr->hasMetadata(LLVMContext::MD_DIAssignID)) {
50495058
NewAddr->setMetadata(LLVMContext::MD_DIAssignID,
50505059
DIAssignID::getDistinct(NewAddr->getContext()));
50515060
}
5061+
50525062
DbgVariableRecord *NewAssign = DbgVariableRecord::createLinkedDVRAssign(
50535063
NewAddr, Orig->getValue(), Orig->getVariable(), NewFragmentExpr, NewAddr,
50545064
Orig->getAddressExpression(), Orig->getDebugLoc());
@@ -5221,6 +5231,7 @@ bool SROA::splitAlloca(AllocaInst &AI, AllocaSlices &AS) {
52215231
};
52225232
for_each(findDbgDeclares(Fragment.Alloca), RemoveOne);
52235233
for_each(findDVRDeclares(Fragment.Alloca), RemoveOne);
5234+
for_each(findDVRValues(Fragment.Alloca), RemoveOne);
52245235

52255236
insertNewDbgInst(DIB, DbgVariable, Fragment.Alloca, FragmentExpr, &AI);
52265237
}
@@ -5230,6 +5241,7 @@ bool SROA::splitAlloca(AllocaInst &AI, AllocaSlices &AS) {
52305241
// and the individual partitions.
52315242
for_each(findDbgDeclares(&AI), MigrateOne);
52325243
for_each(findDVRDeclares(&AI), MigrateOne);
5244+
for_each(findDVRValues(&AI), MigrateOne);
52335245
for_each(at::getAssignmentMarkers(&AI), MigrateOne);
52345246
for_each(at::getDVRAssignmentMarkers(&AI), MigrateOne);
52355247

@@ -5357,6 +5369,8 @@ bool SROA::deleteDeadInstructions(
53575369
OldDII->eraseFromParent();
53585370
for (DbgVariableRecord *OldDII : findDVRDeclares(AI))
53595371
OldDII->eraseFromParent();
5372+
for (DbgVariableRecord *OldDII : findDVRValues(AI))
5373+
OldDII->eraseFromParent();
53605374
}
53615375

53625376
at::deleteAssignmentMarkers(I);

llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,9 @@ rewriteSingleStoreAlloca(AllocaInst *AI, AllocaInfo &Info, LargeBlockInfo &LBI,
582582
DbgItem->eraseFromParent();
583583
} else if (DbgItem->getExpression()->startsWithDeref()) {
584584
DbgItem->eraseFromParent();
585+
} else if (DbgItem->isValueOfVariable()) {
586+
MoveDebugValueToStoreLoc(DbgItem, Info.OnlyStore, DIB);
587+
DbgItem->eraseFromParent();
585588
}
586589
}
587590
};

llvm/test/DebugInfo/X86/sroa-after-inlining.ll

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,11 @@
3535
; CHECK: _Z3barv
3636
; CHECK: %[[RESULT:.*]] = call i32 @_Z3foov
3737
; CHECK: llvm.dbg.value(metadata i32 %[[RESULT]], metadata [[METADATA_IDX1:![0-9]+]]
38+
; CHECK: llvm.dbg.value(metadata i32 %[[RESULT]], metadata [[METADATA_IDX2:![0-9]+]]
3839
; CHECK: ret
3940
; CHECK: DICompileUnit
40-
; CHECK: [[METADATA_IDX1]] = !DILocalVariable(name: "result"
41+
; CHECK: [[METADATA_IDX2]] = !DILocalVariable(name: "result"
42+
; CHECK: [[METADATA_IDX1]] = !DILocalVariable(name: "this"
4143

4244
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
4345
target triple = "x86_64-unknown-linux-gnu"

0 commit comments

Comments
 (0)