[llvm] [DebugInfo][RemoveDIs] Handle DPValues in SelectOptimize (PR #79005)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 22 08:41:11 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-debuginfo
Author: Jeremy Morse (jmorse)
<details>
<summary>Changes</summary>
When there are debug intrinsics in-between groups of select instructions, select-optimise sinks them into the "end" block. This needs to be replicated for DPValues, the non-instruction variable assignment object. Implement that and add a RUN line to a test that was sensitive to this to ensure it gets tested.
(The exact range of instructions being transformed here is a little fiddly, hence I've gone with a helper lambda).
---
Full diff: https://github.com/llvm/llvm-project/pull/79005.diff
2 Files Affected:
- (modified) llvm/lib/CodeGen/SelectOptimize.cpp (+15)
- (modified) llvm/test/CodeGen/X86/select-optimize.ll (+3)
``````````diff
diff --git a/llvm/lib/CodeGen/SelectOptimize.cpp b/llvm/lib/CodeGen/SelectOptimize.cpp
index 1316919e65dacc..84a36d68002e91 100644
--- a/llvm/lib/CodeGen/SelectOptimize.cpp
+++ b/llvm/lib/CodeGen/SelectOptimize.cpp
@@ -491,6 +491,21 @@ void SelectOptimizeImpl::convertProfitableSIGroups(SelectGroups &ProfSIGroups) {
DI->moveBeforePreserving(&*EndBlock->getFirstInsertionPt());
}
+ // Duplicate implementation for DPValues, the non-instruction debug-info
+ // record. Helper lambda for moving DPValues to the end block.
+ auto TransferDPValues = [&](Instruction &I) {
+ for (auto &DPValue : llvm::make_early_inc_range(I.getDbgValueRange())) {
+ DPValue.removeFromParent();
+ EndBlock->insertDPValueBefore(&DPValue, EndBlock->getFirstInsertionPt());
+ }
+ };
+
+ // Iterate over all instructions in between SI and LastSI, not including
+ // SI itself. These are all the variable assignments that happen "in the
+ // middle" of the select group.
+ auto R = make_range(std::next(SI->getIterator()), std::next(LastSI->getIterator()));
+ llvm::for_each(R, TransferDPValues);
+
// These are the new basic blocks for the conditional branch.
// At least one will become an actual new basic block.
BasicBlock *TrueBlock = nullptr, *FalseBlock = nullptr;
diff --git a/llvm/test/CodeGen/X86/select-optimize.ll b/llvm/test/CodeGen/X86/select-optimize.ll
index 6e440654408753..aa04db882f5d40 100644
--- a/llvm/test/CodeGen/X86/select-optimize.ll
+++ b/llvm/test/CodeGen/X86/select-optimize.ll
@@ -2,6 +2,9 @@
; RUN: opt -mtriple=x86_64-unknown-unknown -select-optimize -S < %s | FileCheck %s
; RUN: opt -mtriple=x86_64-unknown-unknown -passes='require<profile-summary>,function(select-optimize)' -S < %s | FileCheck %s
+; RUN: opt -mtriple=x86_64-unknown-unknown -select-optimize -S < %s --try-experimental-debuginfo-iterators | FileCheck %s
+; RUN: opt -mtriple=x86_64-unknown-unknown -passes='require<profile-summary>,function(select-optimize)' -S < %s --try-experimental-debuginfo-iterators | FileCheck %s
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Test base heuristic 1:
;; highly-biased selects assumed to be highly predictable, converted to branches
``````````
</details>
https://github.com/llvm/llvm-project/pull/79005
More information about the llvm-commits
mailing list