[llvm] [DebugInfo][RemoveDIs] Handle DPValues in SelectOptimize (PR #79005)

Jeremy Morse via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 22 08:46:36 PST 2024


https://github.com/jmorse updated https://github.com/llvm/llvm-project/pull/79005

>From 43ba26149f264c9e305729451487fe81fd53a5a4 Mon Sep 17 00:00:00 2001
From: Jeremy Morse <jeremy.morse at sony.com>
Date: Mon, 22 Jan 2024 15:42:19 +0000
Subject: [PATCH 1/2] [DebugInfo][RemoveDIs] Handle DPValues in SelectOptimize

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).
---
 llvm/lib/CodeGen/SelectOptimize.cpp      | 15 +++++++++++++++
 llvm/test/CodeGen/X86/select-optimize.ll |  3 +++
 2 files changed, 18 insertions(+)

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

>From a21ffadfb4293c6a5674c7506c37ec2fe6fb8407 Mon Sep 17 00:00:00 2001
From: Jeremy Morse <jeremy.morse at sony.com>
Date: Mon, 22 Jan 2024 16:46:06 +0000
Subject: [PATCH 2/2] clang-format

---
 llvm/lib/CodeGen/SelectOptimize.cpp | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/CodeGen/SelectOptimize.cpp b/llvm/lib/CodeGen/SelectOptimize.cpp
index 84a36d68002e91..d14283c5215542 100644
--- a/llvm/lib/CodeGen/SelectOptimize.cpp
+++ b/llvm/lib/CodeGen/SelectOptimize.cpp
@@ -496,14 +496,16 @@ void SelectOptimizeImpl::convertProfitableSIGroups(SelectGroups &ProfSIGroups) {
     auto TransferDPValues = [&](Instruction &I) {
       for (auto &DPValue : llvm::make_early_inc_range(I.getDbgValueRange())) {
         DPValue.removeFromParent();
-        EndBlock->insertDPValueBefore(&DPValue, EndBlock->getFirstInsertionPt());
+        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()));
+    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.



More information about the llvm-commits mailing list