-
Notifications
You must be signed in to change notification settings - Fork 15.2k
[LiveDebugValues][NVPTX]VarLocBasedImpl handle vregs, enable for NVPTX #111456
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[LiveDebugValues][NVPTX]VarLocBasedImpl handle vregs, enable for NVPTX #111456
Conversation
|
@llvm/pr-subscribers-backend-nvptx Author: William G Hatch (willghatch) ChangesThis patch handles virtual registers in the VarLocBasedImpl of the LiveDebugVariables pass, allowing it to be used on architectures that depend on virtual registers in debugging, like NVPTX. It enables the pass for NVPTX. Patch is 367.41 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/111456.diff 4 Files Affected:
diff --git a/llvm/lib/CodeGen/LiveDebugValues/LiveDebugValues.cpp b/llvm/lib/CodeGen/LiveDebugValues/LiveDebugValues.cpp
index 0c0a4e13c7c9ec..a2b1662271940d 100644
--- a/llvm/lib/CodeGen/LiveDebugValues/LiveDebugValues.cpp
+++ b/llvm/lib/CodeGen/LiveDebugValues/LiveDebugValues.cpp
@@ -102,14 +102,6 @@ LiveDebugValues::LiveDebugValues() : MachineFunctionPass(ID) {
}
bool LiveDebugValues::runOnMachineFunction(MachineFunction &MF) {
- // Except for Wasm, all targets should be only using physical register at this
- // point. Wasm only use virtual registers throught its pipeline, but its
- // virtual registers don't participate in this LiveDebugValues analysis; only
- // its target indices do.
- assert(MF.getTarget().getTargetTriple().isWasm() ||
- MF.getProperties().hasProperty(
- MachineFunctionProperties::Property::NoVRegs));
-
bool InstrRefBased = MF.useDebugInstrRef();
// Allow the user to force selection of InstrRef LDV.
InstrRefBased |= ForceInstrRefLDV;
diff --git a/llvm/lib/CodeGen/LiveDebugValues/VarLocBasedImpl.cpp b/llvm/lib/CodeGen/LiveDebugValues/VarLocBasedImpl.cpp
index 7e7d90f24fccba..a19a5c19bdeb0a 100644
--- a/llvm/lib/CodeGen/LiveDebugValues/VarLocBasedImpl.cpp
+++ b/llvm/lib/CodeGen/LiveDebugValues/VarLocBasedImpl.cpp
@@ -239,6 +239,10 @@ struct LocIndex {
/// becomes a problem.
static constexpr u32_location_t kWasmLocation = kFirstInvalidRegLocation + 2;
+ /// The first location that is reserved for VarLocs with locations of kind
+ /// VirtualRegisterKind.
+ static constexpr u32_location_t kFirstVirtualRegLocation = 1 << 31;
+
LocIndex(u32_location_t Location, u32_index_t Index)
: Location(Location), Index(Index) {}
@@ -810,9 +814,10 @@ class VarLocBasedLDV : public LDVImpl {
VL.getDescribingRegs(Locations);
assert(all_of(Locations,
[](auto RegNo) {
- return RegNo < LocIndex::kFirstInvalidRegLocation;
+ return (RegNo < LocIndex::kFirstInvalidRegLocation) ||
+ (LocIndex::kFirstVirtualRegLocation <= RegNo);
}) &&
- "Physreg out of range?");
+ "Physical or virtual register out of range?");
if (VL.containsSpillLocs())
Locations.push_back(LocIndex::kSpillLocation);
if (VL.containsWasmLocs())
@@ -941,8 +946,7 @@ class VarLocBasedLDV : public LDVImpl {
/// Return whether the set is empty or not.
bool empty() const {
assert(Vars.empty() == EntryValuesBackupVars.empty() &&
- Vars.empty() == VarLocs.empty() &&
- "open ranges are inconsistent");
+ Vars.empty() == VarLocs.empty() && "open ranges are inconsistent");
return VarLocs.empty();
}
@@ -1240,9 +1244,15 @@ void VarLocBasedLDV::getUsedRegs(const VarLocSet &CollectFrom,
LocIndex::rawIndexForReg(LocIndex::kFirstRegLocation);
uint64_t FirstInvalidIndex =
LocIndex::rawIndexForReg(LocIndex::kFirstInvalidRegLocation);
+ uint64_t FirstVirtualRegIndex =
+ LocIndex::rawIndexForReg(LocIndex::kFirstVirtualRegLocation);
for (auto It = CollectFrom.find(FirstRegIndex),
- End = CollectFrom.find(FirstInvalidIndex);
- It != End;) {
+ PhysEnd = CollectFrom.find(FirstInvalidIndex);
+ It != CollectFrom.end();) {
+ if (It == PhysEnd) {
+ It = CollectFrom.find(FirstVirtualRegIndex);
+ continue;
+ }
// We found a VarLoc ID for a VarLoc that lives in a register. Figure out
// which register and add it to UsedRegs.
uint32_t FoundReg = LocIndex::fromRawInteger(*It).Location;
diff --git a/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp b/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp
index 57b7fa783c14a7..8e6e4395efb559 100644
--- a/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp
+++ b/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp
@@ -309,7 +309,6 @@ void NVPTXPassConfig::addIRPasses() {
disablePass(&MachineCopyPropagationID);
disablePass(&TailDuplicateID);
disablePass(&StackMapLivenessID);
- disablePass(&LiveDebugValuesID);
disablePass(&PostRAMachineSinkingID);
disablePass(&PostRASchedulerID);
disablePass(&FuncletLayoutID);
diff --git a/llvm/test/DebugInfo/NVPTX/debug-info.ll b/llvm/test/DebugInfo/NVPTX/debug-info.ll
index 64509b22ed365d..35443738e05379 100644
--- a/llvm/test/DebugInfo/NVPTX/debug-info.ll
+++ b/llvm/test/DebugInfo/NVPTX/debug-info.ll
@@ -121,20 +121,8 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b64 0
; CHECK-NEXT:.b64 0
; CHECK-NEXT:$L__debug_loc1:
-; CHECK-NEXT:.b64 $L__tmp0
-; CHECK-NEXT:.b64 $L__tmp7
-; CHECK-NEXT:.b8 5 // Loc expr size
-; CHECK-NEXT:.b8 0
-; CHECK-NEXT:.b8 144 // DW_OP_regx
-; CHECK-NEXT:.b8 178 // 2454066
-; CHECK-NEXT:.b8 228 //
-; CHECK-NEXT:.b8 149 //
-; CHECK-NEXT:.b8 1 //
-; CHECK-NEXT:.b64 0
-; CHECK-NEXT:.b64 0
-; CHECK-NEXT:$L__debug_loc2:
; CHECK-NEXT:.b64 $L__tmp5
-; CHECK-NEXT:.b64 $L__tmp7
+; CHECK-NEXT:.b64 $L__func_end0
; CHECK-NEXT:.b8 5 // Loc expr size
; CHECK-NEXT:.b8 0
; CHECK-NEXT:.b8 144 // DW_OP_regx
@@ -478,8 +466,10 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 24 // Abbreviation Code
; CHECK-NEXT:.b8 5 // DW_TAG_formal_parameter
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
+; CHECK-NEXT:.b8 51 // DW_AT_address_class
+; CHECK-NEXT:.b8 11 // DW_FORM_data1
; CHECK-NEXT:.b8 2 // DW_AT_location
-; CHECK-NEXT:.b8 6 // DW_FORM_data4
+; CHECK-NEXT:.b8 10 // DW_FORM_block1
; CHECK-NEXT:.b8 3 // DW_AT_name
; CHECK-NEXT:.b8 8 // DW_FORM_string
; CHECK-NEXT:.b8 58 // DW_AT_decl_file
@@ -491,7 +481,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
; CHECK-NEXT:.b8 25 // Abbreviation Code
-; CHECK-NEXT:.b8 52 // DW_TAG_variable
+; CHECK-NEXT:.b8 5 // DW_TAG_formal_parameter
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 2 // DW_AT_location
; CHECK-NEXT:.b8 6 // DW_FORM_data4
@@ -506,6 +496,21 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
; CHECK-NEXT:.b8 26 // Abbreviation Code
+; CHECK-NEXT:.b8 52 // DW_TAG_variable
+; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
+; CHECK-NEXT:.b8 2 // DW_AT_location
+; CHECK-NEXT:.b8 6 // DW_FORM_data4
+; CHECK-NEXT:.b8 3 // DW_AT_name
+; CHECK-NEXT:.b8 8 // DW_FORM_string
+; CHECK-NEXT:.b8 58 // DW_AT_decl_file
+; CHECK-NEXT:.b8 11 // DW_FORM_data1
+; CHECK-NEXT:.b8 59 // DW_AT_decl_line
+; CHECK-NEXT:.b8 11 // DW_FORM_data1
+; CHECK-NEXT:.b8 73 // DW_AT_type
+; CHECK-NEXT:.b8 19 // DW_FORM_ref4
+; CHECK-NEXT:.b8 0 // EOM(1)
+; CHECK-NEXT:.b8 0 // EOM(2)
+; CHECK-NEXT:.b8 27 // Abbreviation Code
; CHECK-NEXT:.b8 29 // DW_TAG_inlined_subroutine
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 49 // DW_AT_abstract_origin
@@ -522,7 +527,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 11 // DW_FORM_data1
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 27 // Abbreviation Code
+; CHECK-NEXT:.b8 28 // Abbreviation Code
; CHECK-NEXT:.b8 29 // DW_TAG_inlined_subroutine
; CHECK-NEXT:.b8 1 // DW_CHILDREN_yes
; CHECK-NEXT:.b8 49 // DW_AT_abstract_origin
@@ -539,7 +544,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 11 // DW_FORM_data1
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 28 // Abbreviation Code
+; CHECK-NEXT:.b8 29 // Abbreviation Code
; CHECK-NEXT:.b8 5 // DW_TAG_formal_parameter
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 51 // DW_AT_address_class
@@ -550,14 +555,14 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 19 // DW_FORM_ref4
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 29 // Abbreviation Code
+; CHECK-NEXT:.b8 30 // Abbreviation Code
; CHECK-NEXT:.b8 57 // DW_TAG_namespace
; CHECK-NEXT:.b8 1 // DW_CHILDREN_yes
; CHECK-NEXT:.b8 3 // DW_AT_name
; CHECK-NEXT:.b8 8 // DW_FORM_string
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 30 // Abbreviation Code
+; CHECK-NEXT:.b8 31 // Abbreviation Code
; CHECK-NEXT:.b8 8 // DW_TAG_imported_declaration
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 58 // DW_AT_decl_file
@@ -568,7 +573,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 19 // DW_FORM_ref4
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 31 // Abbreviation Code
+; CHECK-NEXT:.b8 32 // Abbreviation Code
; CHECK-NEXT:.b8 8 // DW_TAG_imported_declaration
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 58 // DW_AT_decl_file
@@ -579,7 +584,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 19 // DW_FORM_ref4
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 32 // Abbreviation Code
+; CHECK-NEXT:.b8 33 // Abbreviation Code
; CHECK-NEXT:.b8 46 // DW_TAG_subprogram
; CHECK-NEXT:.b8 1 // DW_CHILDREN_yes
; CHECK-NEXT:.b8 135 // DW_AT_MIPS_linkage_name
@@ -597,7 +602,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 12 // DW_FORM_flag
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 33 // Abbreviation Code
+; CHECK-NEXT:.b8 34 // Abbreviation Code
; CHECK-NEXT:.b8 46 // DW_TAG_subprogram
; CHECK-NEXT:.b8 1 // DW_CHILDREN_yes
; CHECK-NEXT:.b8 3 // DW_AT_name
@@ -614,7 +619,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 12 // DW_FORM_flag
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 34 // Abbreviation Code
+; CHECK-NEXT:.b8 35 // Abbreviation Code
; CHECK-NEXT:.b8 22 // DW_TAG_typedef
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 73 // DW_AT_type
@@ -627,14 +632,14 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 11 // DW_FORM_data1
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 35 // Abbreviation Code
+; CHECK-NEXT:.b8 36 // Abbreviation Code
; CHECK-NEXT:.b8 19 // DW_TAG_structure_type
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 60 // DW_AT_declaration
; CHECK-NEXT:.b8 12 // DW_FORM_flag
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 36 // Abbreviation Code
+; CHECK-NEXT:.b8 37 // Abbreviation Code
; CHECK-NEXT:.b8 19 // DW_TAG_structure_type
; CHECK-NEXT:.b8 1 // DW_CHILDREN_yes
; CHECK-NEXT:.b8 11 // DW_AT_byte_size
@@ -645,7 +650,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 11 // DW_FORM_data1
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 37 // Abbreviation Code
+; CHECK-NEXT:.b8 38 // Abbreviation Code
; CHECK-NEXT:.b8 46 // DW_TAG_subprogram
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 3 // DW_AT_name
@@ -663,7 +668,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 12 // DW_FORM_flag
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 38 // Abbreviation Code
+; CHECK-NEXT:.b8 39 // Abbreviation Code
; CHECK-NEXT:.b8 46 // DW_TAG_subprogram
; CHECK-NEXT:.b8 1 // DW_CHILDREN_yes
; CHECK-NEXT:.b8 3 // DW_AT_name
@@ -680,29 +685,29 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 12 // DW_FORM_flag
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 39 // Abbreviation Code
+; CHECK-NEXT:.b8 40 // Abbreviation Code
; CHECK-NEXT:.b8 21 // DW_TAG_subroutine_type
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 40 // Abbreviation Code
+; CHECK-NEXT:.b8 41 // Abbreviation Code
; CHECK-NEXT:.b8 15 // DW_TAG_pointer_type
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 41 // Abbreviation Code
+; CHECK-NEXT:.b8 42 // Abbreviation Code
; CHECK-NEXT:.b8 38 // DW_TAG_const_type
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 42 // Abbreviation Code
+; CHECK-NEXT:.b8 43 // Abbreviation Code
; CHECK-NEXT:.b8 21 // DW_TAG_subroutine_type
; CHECK-NEXT:.b8 1 // DW_CHILDREN_yes
; CHECK-NEXT:.b8 73 // DW_AT_type
; CHECK-NEXT:.b8 19 // DW_FORM_ref4
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 43 // Abbreviation Code
+; CHECK-NEXT:.b8 44 // Abbreviation Code
; CHECK-NEXT:.b8 46 // DW_TAG_subprogram
; CHECK-NEXT:.b8 1 // DW_CHILDREN_yes
; CHECK-NEXT:.b8 3 // DW_AT_name
@@ -720,7 +725,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 12 // DW_FORM_flag
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 44 // Abbreviation Code
+; CHECK-NEXT:.b8 45 // Abbreviation Code
; CHECK-NEXT:.b8 46 // DW_TAG_subprogram
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 3 // DW_AT_name
@@ -737,7 +742,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 12 // DW_FORM_flag
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 45 // Abbreviation Code
+; CHECK-NEXT:.b8 46 // Abbreviation Code
; CHECK-NEXT:.b8 46 // DW_TAG_subprogram
; CHECK-NEXT:.b8 1 // DW_CHILDREN_yes
; CHECK-NEXT:.b8 135 // DW_AT_MIPS_linkage_name
@@ -759,12 +764,12 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT: }
; CHECK-NEXT: .section .debug_info
; CHECK-NEXT: {
-; CHECK-NEXT:.b32 10032 ...
[truncated]
|
|
@llvm/pr-subscribers-debuginfo Author: William G Hatch (willghatch) ChangesThis patch handles virtual registers in the VarLocBasedImpl of the LiveDebugVariables pass, allowing it to be used on architectures that depend on virtual registers in debugging, like NVPTX. It enables the pass for NVPTX. Patch is 367.41 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/111456.diff 4 Files Affected:
diff --git a/llvm/lib/CodeGen/LiveDebugValues/LiveDebugValues.cpp b/llvm/lib/CodeGen/LiveDebugValues/LiveDebugValues.cpp
index 0c0a4e13c7c9ec..a2b1662271940d 100644
--- a/llvm/lib/CodeGen/LiveDebugValues/LiveDebugValues.cpp
+++ b/llvm/lib/CodeGen/LiveDebugValues/LiveDebugValues.cpp
@@ -102,14 +102,6 @@ LiveDebugValues::LiveDebugValues() : MachineFunctionPass(ID) {
}
bool LiveDebugValues::runOnMachineFunction(MachineFunction &MF) {
- // Except for Wasm, all targets should be only using physical register at this
- // point. Wasm only use virtual registers throught its pipeline, but its
- // virtual registers don't participate in this LiveDebugValues analysis; only
- // its target indices do.
- assert(MF.getTarget().getTargetTriple().isWasm() ||
- MF.getProperties().hasProperty(
- MachineFunctionProperties::Property::NoVRegs));
-
bool InstrRefBased = MF.useDebugInstrRef();
// Allow the user to force selection of InstrRef LDV.
InstrRefBased |= ForceInstrRefLDV;
diff --git a/llvm/lib/CodeGen/LiveDebugValues/VarLocBasedImpl.cpp b/llvm/lib/CodeGen/LiveDebugValues/VarLocBasedImpl.cpp
index 7e7d90f24fccba..a19a5c19bdeb0a 100644
--- a/llvm/lib/CodeGen/LiveDebugValues/VarLocBasedImpl.cpp
+++ b/llvm/lib/CodeGen/LiveDebugValues/VarLocBasedImpl.cpp
@@ -239,6 +239,10 @@ struct LocIndex {
/// becomes a problem.
static constexpr u32_location_t kWasmLocation = kFirstInvalidRegLocation + 2;
+ /// The first location that is reserved for VarLocs with locations of kind
+ /// VirtualRegisterKind.
+ static constexpr u32_location_t kFirstVirtualRegLocation = 1 << 31;
+
LocIndex(u32_location_t Location, u32_index_t Index)
: Location(Location), Index(Index) {}
@@ -810,9 +814,10 @@ class VarLocBasedLDV : public LDVImpl {
VL.getDescribingRegs(Locations);
assert(all_of(Locations,
[](auto RegNo) {
- return RegNo < LocIndex::kFirstInvalidRegLocation;
+ return (RegNo < LocIndex::kFirstInvalidRegLocation) ||
+ (LocIndex::kFirstVirtualRegLocation <= RegNo);
}) &&
- "Physreg out of range?");
+ "Physical or virtual register out of range?");
if (VL.containsSpillLocs())
Locations.push_back(LocIndex::kSpillLocation);
if (VL.containsWasmLocs())
@@ -941,8 +946,7 @@ class VarLocBasedLDV : public LDVImpl {
/// Return whether the set is empty or not.
bool empty() const {
assert(Vars.empty() == EntryValuesBackupVars.empty() &&
- Vars.empty() == VarLocs.empty() &&
- "open ranges are inconsistent");
+ Vars.empty() == VarLocs.empty() && "open ranges are inconsistent");
return VarLocs.empty();
}
@@ -1240,9 +1244,15 @@ void VarLocBasedLDV::getUsedRegs(const VarLocSet &CollectFrom,
LocIndex::rawIndexForReg(LocIndex::kFirstRegLocation);
uint64_t FirstInvalidIndex =
LocIndex::rawIndexForReg(LocIndex::kFirstInvalidRegLocation);
+ uint64_t FirstVirtualRegIndex =
+ LocIndex::rawIndexForReg(LocIndex::kFirstVirtualRegLocation);
for (auto It = CollectFrom.find(FirstRegIndex),
- End = CollectFrom.find(FirstInvalidIndex);
- It != End;) {
+ PhysEnd = CollectFrom.find(FirstInvalidIndex);
+ It != CollectFrom.end();) {
+ if (It == PhysEnd) {
+ It = CollectFrom.find(FirstVirtualRegIndex);
+ continue;
+ }
// We found a VarLoc ID for a VarLoc that lives in a register. Figure out
// which register and add it to UsedRegs.
uint32_t FoundReg = LocIndex::fromRawInteger(*It).Location;
diff --git a/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp b/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp
index 57b7fa783c14a7..8e6e4395efb559 100644
--- a/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp
+++ b/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp
@@ -309,7 +309,6 @@ void NVPTXPassConfig::addIRPasses() {
disablePass(&MachineCopyPropagationID);
disablePass(&TailDuplicateID);
disablePass(&StackMapLivenessID);
- disablePass(&LiveDebugValuesID);
disablePass(&PostRAMachineSinkingID);
disablePass(&PostRASchedulerID);
disablePass(&FuncletLayoutID);
diff --git a/llvm/test/DebugInfo/NVPTX/debug-info.ll b/llvm/test/DebugInfo/NVPTX/debug-info.ll
index 64509b22ed365d..35443738e05379 100644
--- a/llvm/test/DebugInfo/NVPTX/debug-info.ll
+++ b/llvm/test/DebugInfo/NVPTX/debug-info.ll
@@ -121,20 +121,8 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b64 0
; CHECK-NEXT:.b64 0
; CHECK-NEXT:$L__debug_loc1:
-; CHECK-NEXT:.b64 $L__tmp0
-; CHECK-NEXT:.b64 $L__tmp7
-; CHECK-NEXT:.b8 5 // Loc expr size
-; CHECK-NEXT:.b8 0
-; CHECK-NEXT:.b8 144 // DW_OP_regx
-; CHECK-NEXT:.b8 178 // 2454066
-; CHECK-NEXT:.b8 228 //
-; CHECK-NEXT:.b8 149 //
-; CHECK-NEXT:.b8 1 //
-; CHECK-NEXT:.b64 0
-; CHECK-NEXT:.b64 0
-; CHECK-NEXT:$L__debug_loc2:
; CHECK-NEXT:.b64 $L__tmp5
-; CHECK-NEXT:.b64 $L__tmp7
+; CHECK-NEXT:.b64 $L__func_end0
; CHECK-NEXT:.b8 5 // Loc expr size
; CHECK-NEXT:.b8 0
; CHECK-NEXT:.b8 144 // DW_OP_regx
@@ -478,8 +466,10 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 24 // Abbreviation Code
; CHECK-NEXT:.b8 5 // DW_TAG_formal_parameter
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
+; CHECK-NEXT:.b8 51 // DW_AT_address_class
+; CHECK-NEXT:.b8 11 // DW_FORM_data1
; CHECK-NEXT:.b8 2 // DW_AT_location
-; CHECK-NEXT:.b8 6 // DW_FORM_data4
+; CHECK-NEXT:.b8 10 // DW_FORM_block1
; CHECK-NEXT:.b8 3 // DW_AT_name
; CHECK-NEXT:.b8 8 // DW_FORM_string
; CHECK-NEXT:.b8 58 // DW_AT_decl_file
@@ -491,7 +481,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
; CHECK-NEXT:.b8 25 // Abbreviation Code
-; CHECK-NEXT:.b8 52 // DW_TAG_variable
+; CHECK-NEXT:.b8 5 // DW_TAG_formal_parameter
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 2 // DW_AT_location
; CHECK-NEXT:.b8 6 // DW_FORM_data4
@@ -506,6 +496,21 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
; CHECK-NEXT:.b8 26 // Abbreviation Code
+; CHECK-NEXT:.b8 52 // DW_TAG_variable
+; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
+; CHECK-NEXT:.b8 2 // DW_AT_location
+; CHECK-NEXT:.b8 6 // DW_FORM_data4
+; CHECK-NEXT:.b8 3 // DW_AT_name
+; CHECK-NEXT:.b8 8 // DW_FORM_string
+; CHECK-NEXT:.b8 58 // DW_AT_decl_file
+; CHECK-NEXT:.b8 11 // DW_FORM_data1
+; CHECK-NEXT:.b8 59 // DW_AT_decl_line
+; CHECK-NEXT:.b8 11 // DW_FORM_data1
+; CHECK-NEXT:.b8 73 // DW_AT_type
+; CHECK-NEXT:.b8 19 // DW_FORM_ref4
+; CHECK-NEXT:.b8 0 // EOM(1)
+; CHECK-NEXT:.b8 0 // EOM(2)
+; CHECK-NEXT:.b8 27 // Abbreviation Code
; CHECK-NEXT:.b8 29 // DW_TAG_inlined_subroutine
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 49 // DW_AT_abstract_origin
@@ -522,7 +527,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 11 // DW_FORM_data1
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 27 // Abbreviation Code
+; CHECK-NEXT:.b8 28 // Abbreviation Code
; CHECK-NEXT:.b8 29 // DW_TAG_inlined_subroutine
; CHECK-NEXT:.b8 1 // DW_CHILDREN_yes
; CHECK-NEXT:.b8 49 // DW_AT_abstract_origin
@@ -539,7 +544,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 11 // DW_FORM_data1
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 28 // Abbreviation Code
+; CHECK-NEXT:.b8 29 // Abbreviation Code
; CHECK-NEXT:.b8 5 // DW_TAG_formal_parameter
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 51 // DW_AT_address_class
@@ -550,14 +555,14 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 19 // DW_FORM_ref4
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 29 // Abbreviation Code
+; CHECK-NEXT:.b8 30 // Abbreviation Code
; CHECK-NEXT:.b8 57 // DW_TAG_namespace
; CHECK-NEXT:.b8 1 // DW_CHILDREN_yes
; CHECK-NEXT:.b8 3 // DW_AT_name
; CHECK-NEXT:.b8 8 // DW_FORM_string
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 30 // Abbreviation Code
+; CHECK-NEXT:.b8 31 // Abbreviation Code
; CHECK-NEXT:.b8 8 // DW_TAG_imported_declaration
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 58 // DW_AT_decl_file
@@ -568,7 +573,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 19 // DW_FORM_ref4
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 31 // Abbreviation Code
+; CHECK-NEXT:.b8 32 // Abbreviation Code
; CHECK-NEXT:.b8 8 // DW_TAG_imported_declaration
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 58 // DW_AT_decl_file
@@ -579,7 +584,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 19 // DW_FORM_ref4
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 32 // Abbreviation Code
+; CHECK-NEXT:.b8 33 // Abbreviation Code
; CHECK-NEXT:.b8 46 // DW_TAG_subprogram
; CHECK-NEXT:.b8 1 // DW_CHILDREN_yes
; CHECK-NEXT:.b8 135 // DW_AT_MIPS_linkage_name
@@ -597,7 +602,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 12 // DW_FORM_flag
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 33 // Abbreviation Code
+; CHECK-NEXT:.b8 34 // Abbreviation Code
; CHECK-NEXT:.b8 46 // DW_TAG_subprogram
; CHECK-NEXT:.b8 1 // DW_CHILDREN_yes
; CHECK-NEXT:.b8 3 // DW_AT_name
@@ -614,7 +619,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 12 // DW_FORM_flag
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 34 // Abbreviation Code
+; CHECK-NEXT:.b8 35 // Abbreviation Code
; CHECK-NEXT:.b8 22 // DW_TAG_typedef
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 73 // DW_AT_type
@@ -627,14 +632,14 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 11 // DW_FORM_data1
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 35 // Abbreviation Code
+; CHECK-NEXT:.b8 36 // Abbreviation Code
; CHECK-NEXT:.b8 19 // DW_TAG_structure_type
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 60 // DW_AT_declaration
; CHECK-NEXT:.b8 12 // DW_FORM_flag
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 36 // Abbreviation Code
+; CHECK-NEXT:.b8 37 // Abbreviation Code
; CHECK-NEXT:.b8 19 // DW_TAG_structure_type
; CHECK-NEXT:.b8 1 // DW_CHILDREN_yes
; CHECK-NEXT:.b8 11 // DW_AT_byte_size
@@ -645,7 +650,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 11 // DW_FORM_data1
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 37 // Abbreviation Code
+; CHECK-NEXT:.b8 38 // Abbreviation Code
; CHECK-NEXT:.b8 46 // DW_TAG_subprogram
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 3 // DW_AT_name
@@ -663,7 +668,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 12 // DW_FORM_flag
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 38 // Abbreviation Code
+; CHECK-NEXT:.b8 39 // Abbreviation Code
; CHECK-NEXT:.b8 46 // DW_TAG_subprogram
; CHECK-NEXT:.b8 1 // DW_CHILDREN_yes
; CHECK-NEXT:.b8 3 // DW_AT_name
@@ -680,29 +685,29 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 12 // DW_FORM_flag
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 39 // Abbreviation Code
+; CHECK-NEXT:.b8 40 // Abbreviation Code
; CHECK-NEXT:.b8 21 // DW_TAG_subroutine_type
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 40 // Abbreviation Code
+; CHECK-NEXT:.b8 41 // Abbreviation Code
; CHECK-NEXT:.b8 15 // DW_TAG_pointer_type
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 41 // Abbreviation Code
+; CHECK-NEXT:.b8 42 // Abbreviation Code
; CHECK-NEXT:.b8 38 // DW_TAG_const_type
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 42 // Abbreviation Code
+; CHECK-NEXT:.b8 43 // Abbreviation Code
; CHECK-NEXT:.b8 21 // DW_TAG_subroutine_type
; CHECK-NEXT:.b8 1 // DW_CHILDREN_yes
; CHECK-NEXT:.b8 73 // DW_AT_type
; CHECK-NEXT:.b8 19 // DW_FORM_ref4
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 43 // Abbreviation Code
+; CHECK-NEXT:.b8 44 // Abbreviation Code
; CHECK-NEXT:.b8 46 // DW_TAG_subprogram
; CHECK-NEXT:.b8 1 // DW_CHILDREN_yes
; CHECK-NEXT:.b8 3 // DW_AT_name
@@ -720,7 +725,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 12 // DW_FORM_flag
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 44 // Abbreviation Code
+; CHECK-NEXT:.b8 45 // Abbreviation Code
; CHECK-NEXT:.b8 46 // DW_TAG_subprogram
; CHECK-NEXT:.b8 0 // DW_CHILDREN_no
; CHECK-NEXT:.b8 3 // DW_AT_name
@@ -737,7 +742,7 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT:.b8 12 // DW_FORM_flag
; CHECK-NEXT:.b8 0 // EOM(1)
; CHECK-NEXT:.b8 0 // EOM(2)
-; CHECK-NEXT:.b8 45 // Abbreviation Code
+; CHECK-NEXT:.b8 46 // Abbreviation Code
; CHECK-NEXT:.b8 46 // DW_TAG_subprogram
; CHECK-NEXT:.b8 1 // DW_CHILDREN_yes
; CHECK-NEXT:.b8 135 // DW_AT_MIPS_linkage_name
@@ -759,12 +764,12 @@ if.end: ; preds = %if.then, %entry
; CHECK-NEXT: }
; CHECK-NEXT: .section .debug_info
; CHECK-NEXT: {
-; CHECK-NEXT:.b32 10032 ...
[truncated]
|
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
… for NVPTX This patch handles virtual registers in the VarLocBasedImpl of the LiveDebugVariables pass, allowing it to be used on architectures that depend on virtual registers in debugging, like NVPTX. It enables the pass for NVPTX.
09739fe to
97a01f1
Compare
walter-erquinigo
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
cool stuff, man!
| for (auto It = CollectFrom.find(FirstRegIndex), | ||
| End = CollectFrom.find(FirstInvalidIndex); | ||
| It != End;) { | ||
| PhysEnd = CollectFrom.find(FirstInvalidIndex); | ||
| It != CollectFrom.end();) { | ||
| if (It == PhysEnd) { | ||
| It = CollectFrom.find(FirstVirtualRegIndex); | ||
| continue; | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What about moving the code within the for loop into a lambda, and then having two different for loops invoke the lambda internally? The first loop would go over physical registers, and the second one would go over virtual ones. I think the code would be clearer that way
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lol, I had it written that way, then decided that this was better.
This patch handles virtual registers in the VarLocBasedImpl of the LiveDebugVariables pass, allowing it to be used on architectures that depend on virtual registers in debugging, like NVPTX. It enables the pass for NVPTX.