mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-20 19:42:54 +02:00
[LiveDebugValues] Do not insert DBG_VALUEs after a MBB terminator
This fixes a miscompile that happened because a DBG_VALUE interfered with the MachineOutliner's liveness analysis. Inserting a DBG_VALUE after a terminator breaks predicates on MBB such as isReturnBlock(). And the resulting DBG_VALUE cannot be "live". I plan to introduce a MachineVerifier check for this situation in a follow up. rdar://59859175 Testing: check-llvm, LNT build with a stage2 compiler & entry values enabled Differential Revision: https://reviews.llvm.org/D75548
This commit is contained in:
parent
ed198c45c9
commit
4933893b80
@ -959,6 +959,10 @@ void LiveDebugValues::emitEntryValues(MachineInstr &MI,
|
||||
VarLocMap &VarLocIDs,
|
||||
TransferMap &Transfers,
|
||||
VarLocSet &KillSet) {
|
||||
// Do not insert entry value locations after a terminator.
|
||||
if (MI.isTerminator())
|
||||
return;
|
||||
|
||||
for (uint64_t ID : KillSet) {
|
||||
LocIndex Idx = LocIndex::fromRawInteger(ID);
|
||||
const VarLoc &VL = VarLocIDs[Idx];
|
||||
@ -1003,6 +1007,7 @@ void LiveDebugValues::insertTransferDebugPair(
|
||||
// Record the new location as an open range, and a postponed transfer
|
||||
// inserting a DBG_VALUE for this location.
|
||||
OpenRanges.insert(LocId, VL);
|
||||
assert(!MI.isTerminator() && "Cannot insert DBG_VALUE after terminator");
|
||||
TransferDebugPair MIP = {&MI, LocId};
|
||||
Transfers.push_back(MIP);
|
||||
};
|
||||
@ -1778,6 +1783,8 @@ bool LiveDebugValues::ExtendRanges(MachineFunction &MF) {
|
||||
|
||||
// Add any DBG_VALUE instructions created by location transfers.
|
||||
for (auto &TR : Transfers) {
|
||||
assert(!TR.TransferInst->isTerminator() &&
|
||||
"Cannot insert DBG_VALUE after terminator");
|
||||
MachineBasicBlock *MBB = TR.TransferInst->getParent();
|
||||
const VarLoc &VL = VarLocIDs[TR.LocationID];
|
||||
MachineInstr *MI = VL.BuildDbgValue(MF);
|
||||
|
@ -1,4 +1,4 @@
|
||||
# RUN: llc -debug-entry-values -run-pass=livedebugvalues -march=x86-64 -o - %s | FileCheck %s
|
||||
# RUN: llc -debug-entry-values -run-pass=livedebugvalues -verify-machineinstrs -march=x86-64 -o - %s | FileCheck %s
|
||||
#
|
||||
#extern void fn2(int);
|
||||
#
|
||||
@ -15,7 +15,7 @@
|
||||
# u --;
|
||||
#}
|
||||
# CHECK: DBG_VALUE $edi, $noreg, !14, !DIExpression(DW_OP_LLVM_entry_value, 1), debug-location {{.*}}
|
||||
# CHECK: DBG_VALUE $esi, $noreg, !15, !DIExpression(DW_OP_LLVM_entry_value, 1), debug-location {{.*}}
|
||||
# CHECK-NOT: DBG_VALUE $esi, $noreg, !15, !DIExpression(DW_OP_LLVM_entry_value, 1)
|
||||
|
||||
--- |
|
||||
; ModuleID = 'test.c'
|
||||
|
Loading…
Reference in New Issue
Block a user