From d7fb9eb818d22085c7dae0ce9a8be7ade963d7e5 Mon Sep 17 00:00:00 2001 From: Jeremy Morse Date: Mon, 22 Jan 2024 18:12:24 +0000 Subject: [PATCH] [DebugInfo][RemoveDIs] Handle DPValues in SelectOptimize (#79005) 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 | 17 +++++++++++++++++ llvm/test/CodeGen/X86/select-optimize.ll | 3 +++ 2 files changed, 20 insertions(+) diff --git a/llvm/lib/CodeGen/SelectOptimize.cpp b/llvm/lib/CodeGen/SelectOptimize.cpp index 1316919e65dacc..d14283c5215542 100644 --- a/llvm/lib/CodeGen/SelectOptimize.cpp +++ b/llvm/lib/CodeGen/SelectOptimize.cpp @@ -491,6 +491,23 @@ 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,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,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