[llvm] [DebugInfo] Remove getPrevNonDebugInstruction (PR #148859)
Jeremy Morse via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 15 08:55:14 PDT 2025
https://github.com/jmorse updated https://github.com/llvm/llvm-project/pull/148859
>From 74bdc2563f66e06129dd3ceac4748f265b62b985 Mon Sep 17 00:00:00 2001
From: Jeremy Morse <jeremy.morse at sony.com>
Date: Tue, 15 Jul 2025 15:23:00 +0100
Subject: [PATCH 1/2] [DebugInfo] Remove getPrevNonDebugInstruction
With the advent of intrinsic-less debug-info, we no longer need to scatter
calls to getPrevNonDebugInstruction around the codebase. Remove most of
them -- however there are one or two that have the "SkipPseudoOp" flag
turned on, indicating that those call-sites are intended to skip more than
just debug-info intrinsics.
To avoid making a functional change, I've renamed the method to
getPrevNonPseudoOpInstruction and left it in the positions that request
that behaviour using the SkipPseudoOp flag.
---
llvm/include/llvm/IR/Instruction.h | 12 +++++-------
.../llvm/Transforms/Utils/LockstepReverseIterator.h | 4 ++--
llvm/lib/CodeGen/CodeGenPrepare.cpp | 4 ++--
llvm/lib/CodeGen/StackProtector.cpp | 2 +-
llvm/lib/IR/Instruction.cpp | 4 ++--
llvm/lib/Transforms/IPO/OpenMPOpt.cpp | 2 +-
llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | 2 +-
.../Transforms/InstCombine/InstructionCombining.cpp | 2 +-
.../Transforms/Instrumentation/AddressSanitizer.cpp | 2 +-
llvm/lib/Transforms/Scalar/GVN.cpp | 2 +-
llvm/lib/Transforms/Scalar/GVNSink.cpp | 2 +-
llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp | 2 +-
llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp | 4 ++--
13 files changed, 21 insertions(+), 23 deletions(-)
diff --git a/llvm/include/llvm/IR/Instruction.h b/llvm/include/llvm/IR/Instruction.h
index ef382a9168f24..8e2ef436a04a0 100644
--- a/llvm/include/llvm/IR/Instruction.h
+++ b/llvm/include/llvm/IR/Instruction.h
@@ -909,15 +909,13 @@ class Instruction : public User,
SkipPseudoOp));
}
- /// Return a pointer to the previous non-debug instruction in the same basic
- /// block as 'this', or nullptr if no such instruction exists. Skip any pseudo
- /// operations if \c SkipPseudoOp is true.
+ /// Return a pointer to the previous non-pseudo-op instruction in the same
+ /// basic block as 'this', or nullptr if no such instruction exists.
LLVM_ABI const Instruction *
- getPrevNonDebugInstruction(bool SkipPseudoOp = false) const;
- Instruction *getPrevNonDebugInstruction(bool SkipPseudoOp = false) {
+ getPrevNonPseudoOpInstruction() const;
+ Instruction *getPrevNonPseudoOpInstruction() {
return const_cast<Instruction *>(
- static_cast<const Instruction *>(this)->getPrevNonDebugInstruction(
- SkipPseudoOp));
+ static_cast<const Instruction *>(this)->getPrevNonPseudoOpInstruction());
}
/// Create a copy of 'this' instruction that is identical in all ways except
diff --git a/llvm/include/llvm/Transforms/Utils/LockstepReverseIterator.h b/llvm/include/llvm/Transforms/Utils/LockstepReverseIterator.h
index 1b6309c7fb1a4..836374554128b 100644
--- a/llvm/include/llvm/Transforms/Utils/LockstepReverseIterator.h
+++ b/llvm/include/llvm/Transforms/Utils/LockstepReverseIterator.h
@@ -61,7 +61,7 @@ class LockstepReverseIterator
}
Insts.clear();
for (BasicBlock *BB : Blocks) {
- Instruction *Prev = BB->getTerminator()->getPrevNonDebugInstruction();
+ Instruction *Prev = BB->getTerminator()->getPrevNode();
if (!Prev) {
// Block wasn't big enough - only contained a terminator.
if constexpr (EarlyFailure) {
@@ -108,7 +108,7 @@ class LockstepReverseIterator
return *this;
SmallVector<Instruction *, 4> NewInsts;
for (Instruction *Inst : Insts) {
- Instruction *Prev = Inst->getPrevNonDebugInstruction();
+ Instruction *Prev = Inst->getPrevNode();
if (!Prev) {
if constexpr (!EarlyFailure) {
this->ActiveBlocks.remove(Inst->getParent());
diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp
index 9bbb89e37865d..27715aad461e1 100644
--- a/llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -3015,7 +3015,7 @@ bool CodeGenPrepare::dupRetToEnableTailCallOpts(BasicBlock *BB,
// %phi = phi ptr [ %0, %bb0 ], [ %2, %entry ]
if (PredBB && PredBB->getSingleSuccessor() == BB)
CI = dyn_cast_or_null<CallInst>(
- PredBB->getTerminator()->getPrevNonDebugInstruction(true));
+ PredBB->getTerminator()->getPrevNonPseudoOpInstruction());
if (CI && CI->use_empty() &&
isIntrinsicOrLFToBeTailCalled(TLInfo, CI) &&
@@ -3032,7 +3032,7 @@ bool CodeGenPrepare::dupRetToEnableTailCallOpts(BasicBlock *BB,
for (BasicBlock *Pred : predecessors(BB)) {
if (!VisitedBBs.insert(Pred).second)
continue;
- if (Instruction *I = Pred->rbegin()->getPrevNonDebugInstruction(true)) {
+ if (Instruction *I = Pred->rbegin()->getPrevNonPseudoOpInstruction()) {
CallInst *CI = dyn_cast<CallInst>(I);
if (CI && CI->use_empty() && TLI->mayBeEmittedAsTailCall(CI) &&
attributesPermitTailCall(F, CI, RetI, *TLI)) {
diff --git a/llvm/lib/CodeGen/StackProtector.cpp b/llvm/lib/CodeGen/StackProtector.cpp
index 3ec70083b7043..9cc9af88c5e4f 100644
--- a/llvm/lib/CodeGen/StackProtector.cpp
+++ b/llvm/lib/CodeGen/StackProtector.cpp
@@ -626,7 +626,7 @@ bool InsertStackProtectors(const TargetMachine *TM, Function *F,
// If we're instrumenting a block with a tail call, the check has to be
// inserted before the call rather than between it and the return.
- Instruction *Prev = CheckLoc->getPrevNonDebugInstruction();
+ Instruction *Prev = CheckLoc->getPrevNode();
if (auto *CI = dyn_cast_if_present<CallInst>(Prev))
if (CI->isTailCall() && isInTailCallPosition(*CI, *TM))
CheckLoc = Prev;
diff --git a/llvm/lib/IR/Instruction.cpp b/llvm/lib/IR/Instruction.cpp
index cbf39b8adf1b2..83f45d2d16fd6 100644
--- a/llvm/lib/IR/Instruction.cpp
+++ b/llvm/lib/IR/Instruction.cpp
@@ -1244,9 +1244,9 @@ Instruction::getNextNonDebugInstruction(bool SkipPseudoOp) const {
}
const Instruction *
-Instruction::getPrevNonDebugInstruction(bool SkipPseudoOp) const {
+Instruction::getPrevNonPseudoOpInstruction() const {
for (const Instruction *I = getPrevNode(); I; I = I->getPrevNode())
- if (!isa<DbgInfoIntrinsic>(I) && !(SkipPseudoOp && isa<PseudoProbeInst>(I)))
+ if (!isa<PseudoProbeInst>(I))
return I;
return nullptr;
}
diff --git a/llvm/lib/Transforms/IPO/OpenMPOpt.cpp b/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
index dd7ae7e66e350..1ca89b5937ba4 100644
--- a/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
+++ b/llvm/lib/Transforms/IPO/OpenMPOpt.cpp
@@ -2875,7 +2875,7 @@ struct AAExecutionDomainFunction : public AAExecutionDomain {
if (It->getSecond().IsReachedFromAlignedBarrierOnly)
break;
return false;
- } while ((CurI = CurI->getPrevNonDebugInstruction()));
+ } while ((CurI = CurI->getPrevNode()));
// Delayed decision on the forward pass to allow aligned barrier detection
// in the backwards traversal.
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
index e521c9d7001ac..a222fef3f70bd 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -3933,7 +3933,7 @@ Instruction *InstCombinerImpl::visitFenceInst(FenceInst &FI) {
if (NFI && isIdenticalOrStrongerFence(NFI, &FI))
return eraseInstFromFunction(FI);
- if (auto *PFI = dyn_cast_or_null<FenceInst>(FI.getPrevNonDebugInstruction()))
+ if (auto *PFI = dyn_cast_or_null<FenceInst>(FI.getPrevNode()))
if (isIdenticalOrStrongerFence(PFI, &FI))
return eraseInstFromFunction(FI);
return nullptr;
diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
index 91a1b61ddc483..b587d76465803 100644
--- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
@@ -3890,7 +3890,7 @@ bool InstCombinerImpl::removeInstructionsBeforeUnreachable(Instruction &I) {
// This includes instructions like stores and "llvm.assume" that may not get
// removed by simple dead code elimination.
bool Changed = false;
- while (Instruction *Prev = I.getPrevNonDebugInstruction()) {
+ while (Instruction *Prev = I.getPrevNode()) {
// While we theoretically can erase EH, that would result in a block that
// used to start with an EH no longer starting with EH, which is invalid.
// To make it valid, we'd need to fixup predecessors to no longer refer to
diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
index 840a5e3f31dfd..18806a93b76cd 100644
--- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
@@ -3424,7 +3424,7 @@ static void findStoresToUninstrumentedArgAllocas(
isa<Argument>(cast<CastInst>(Val)->getOperand(0)) &&
// Check that the cast appears directly before the store. Otherwise
// moving the cast before InsBefore may break the IR.
- Val == It->getPrevNonDebugInstruction();
+ Val == It->getPrevNode();
bool IsArgInit = IsDirectArgInit || IsArgInitViaCast;
if (!IsArgInit)
continue;
diff --git a/llvm/lib/Transforms/Scalar/GVN.cpp b/llvm/lib/Transforms/Scalar/GVN.cpp
index d9d05c3e8cc49..8bff458f88bb9 100644
--- a/llvm/lib/Transforms/Scalar/GVN.cpp
+++ b/llvm/lib/Transforms/Scalar/GVN.cpp
@@ -1310,7 +1310,7 @@ static Value *findDominatingValue(const MemoryLocation &Loc, Type *LoadTy,
BatchAAResults BatchAA(*AA);
for (BasicBlock *BB = FromBB; BB; BB = BB->getSinglePredecessor())
for (auto *Inst = BB == FromBB ? From : BB->getTerminator();
- Inst != nullptr; Inst = Inst->getPrevNonDebugInstruction()) {
+ Inst != nullptr; Inst = Inst->getPrevNode()) {
// Stop the search if limit is reached.
if (++NumVisitedInsts > MaxNumVisitedInsts)
return nullptr;
diff --git a/llvm/lib/Transforms/Scalar/GVNSink.cpp b/llvm/lib/Transforms/Scalar/GVNSink.cpp
index 2058df33ea331..a5fc0b4c6904d 100644
--- a/llvm/lib/Transforms/Scalar/GVNSink.cpp
+++ b/llvm/lib/Transforms/Scalar/GVNSink.cpp
@@ -799,7 +799,7 @@ void GVNSink::sinkLastInstruction(ArrayRef<BasicBlock *> Blocks,
BasicBlock *BBEnd) {
SmallVector<Instruction *, 4> Insts;
for (BasicBlock *BB : Blocks)
- Insts.push_back(BB->getTerminator()->getPrevNonDebugInstruction());
+ Insts.push_back(BB->getTerminator()->getPrevNode());
Instruction *I0 = Insts.front();
SmallVector<Value *, 4> NewOperands;
diff --git a/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp b/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp
index a09303bb4469f..609edc9312489 100644
--- a/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp
+++ b/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp
@@ -195,7 +195,7 @@ static bool tailMergeBlocksWithSimilarFunctionTerminators(Function &F,
// of the value computed by experimental_deoptimize.
// I.e., we can not change `ret` to `br` for this block.
if (auto *CI =
- dyn_cast_or_null<CallInst>(Term->getPrevNonDebugInstruction())) {
+ dyn_cast_or_null<CallInst>(Term->getPrevNode())) {
if (Function *F = CI->getCalledFunction())
if (Intrinsic::ID ID = F->getIntrinsicID())
if (ID == Intrinsic::experimental_deoptimize)
diff --git a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
index d019ade03ec45..04089797f7b54 100644
--- a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
+++ b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
@@ -2737,7 +2737,7 @@ TEST_P(OpenMPIRBuilderTestWithParams, DynamicWorkShareLoop) {
EXPECT_EQ(OrigStride->getValue(), 1);
CallInst *FiniCall = dyn_cast<CallInst>(
- &*(LatchBlock->getTerminator()->getPrevNonDebugInstruction(true)));
+ &*(LatchBlock->getTerminator()->getPrevNonPseudoOpInstruction()));
EXPECT_EQ(FiniCall, nullptr);
// The original loop iterator should only be used in the condition, in the
@@ -2841,7 +2841,7 @@ TEST_F(OpenMPIRBuilderTest, DynamicWorkShareLoopOrdered) {
static_cast<uint64_t>(OMPScheduleType::OrderedStaticChunked));
CallInst *FiniCall = dyn_cast<CallInst>(
- &*(LatchBlock->getTerminator()->getPrevNonDebugInstruction(true)));
+ &*(LatchBlock->getTerminator()->getPrevNonPseudoOpInstruction()));
ASSERT_NE(FiniCall, nullptr);
EXPECT_EQ(FiniCall->getCalledFunction()->getName(),
"__kmpc_dispatch_fini_4u");
>From fb895ed421a1accf337ab950fbfcd904a45000eb Mon Sep 17 00:00:00 2001
From: Jeremy Morse <jeremy.morse at sony.com>
Date: Tue, 15 Jul 2025 16:54:47 +0100
Subject: [PATCH 2/2] Remove getPrev... entirely.
---
llvm/include/llvm/IR/Instruction.h | 9 ---------
llvm/lib/CodeGen/CodeGenPrepare.cpp | 4 ++--
llvm/lib/IR/Instruction.cpp | 8 --------
llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp | 4 ++--
4 files changed, 4 insertions(+), 21 deletions(-)
diff --git a/llvm/include/llvm/IR/Instruction.h b/llvm/include/llvm/IR/Instruction.h
index 8e2ef436a04a0..2f148d2f856ca 100644
--- a/llvm/include/llvm/IR/Instruction.h
+++ b/llvm/include/llvm/IR/Instruction.h
@@ -909,15 +909,6 @@ class Instruction : public User,
SkipPseudoOp));
}
- /// Return a pointer to the previous non-pseudo-op instruction in the same
- /// basic block as 'this', or nullptr if no such instruction exists.
- LLVM_ABI const Instruction *
- getPrevNonPseudoOpInstruction() const;
- Instruction *getPrevNonPseudoOpInstruction() {
- return const_cast<Instruction *>(
- static_cast<const Instruction *>(this)->getPrevNonPseudoOpInstruction());
- }
-
/// Create a copy of 'this' instruction that is identical in all ways except
/// the following:
/// * The instruction has no parent
diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp
index 27715aad461e1..514a0c39ebddb 100644
--- a/llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -3015,7 +3015,7 @@ bool CodeGenPrepare::dupRetToEnableTailCallOpts(BasicBlock *BB,
// %phi = phi ptr [ %0, %bb0 ], [ %2, %entry ]
if (PredBB && PredBB->getSingleSuccessor() == BB)
CI = dyn_cast_or_null<CallInst>(
- PredBB->getTerminator()->getPrevNonPseudoOpInstruction());
+ PredBB->getTerminator()->getPrevNode());
if (CI && CI->use_empty() &&
isIntrinsicOrLFToBeTailCalled(TLInfo, CI) &&
@@ -3032,7 +3032,7 @@ bool CodeGenPrepare::dupRetToEnableTailCallOpts(BasicBlock *BB,
for (BasicBlock *Pred : predecessors(BB)) {
if (!VisitedBBs.insert(Pred).second)
continue;
- if (Instruction *I = Pred->rbegin()->getPrevNonPseudoOpInstruction()) {
+ if (Instruction *I = Pred->rbegin()->getPrevNode()) {
CallInst *CI = dyn_cast<CallInst>(I);
if (CI && CI->use_empty() && TLI->mayBeEmittedAsTailCall(CI) &&
attributesPermitTailCall(F, CI, RetI, *TLI)) {
diff --git a/llvm/lib/IR/Instruction.cpp b/llvm/lib/IR/Instruction.cpp
index 83f45d2d16fd6..36e9394c1451c 100644
--- a/llvm/lib/IR/Instruction.cpp
+++ b/llvm/lib/IR/Instruction.cpp
@@ -1243,14 +1243,6 @@ Instruction::getNextNonDebugInstruction(bool SkipPseudoOp) const {
return nullptr;
}
-const Instruction *
-Instruction::getPrevNonPseudoOpInstruction() const {
- for (const Instruction *I = getPrevNode(); I; I = I->getPrevNode())
- if (!isa<PseudoProbeInst>(I))
- return I;
- return nullptr;
-}
-
const DebugLoc &Instruction::getStableDebugLoc() const {
if (isa<DbgInfoIntrinsic>(this))
if (const Instruction *Next = getNextNonDebugInstruction())
diff --git a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
index 04089797f7b54..bdd6df2703501 100644
--- a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
+++ b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
@@ -2737,7 +2737,7 @@ TEST_P(OpenMPIRBuilderTestWithParams, DynamicWorkShareLoop) {
EXPECT_EQ(OrigStride->getValue(), 1);
CallInst *FiniCall = dyn_cast<CallInst>(
- &*(LatchBlock->getTerminator()->getPrevNonPseudoOpInstruction()));
+ &*(LatchBlock->getTerminator()->getPrevNode()));
EXPECT_EQ(FiniCall, nullptr);
// The original loop iterator should only be used in the condition, in the
@@ -2841,7 +2841,7 @@ TEST_F(OpenMPIRBuilderTest, DynamicWorkShareLoopOrdered) {
static_cast<uint64_t>(OMPScheduleType::OrderedStaticChunked));
CallInst *FiniCall = dyn_cast<CallInst>(
- &*(LatchBlock->getTerminator()->getPrevNonPseudoOpInstruction()));
+ &*(LatchBlock->getTerminator()->getPrevNode()));
ASSERT_NE(FiniCall, nullptr);
EXPECT_EQ(FiniCall->getCalledFunction()->getName(),
"__kmpc_dispatch_fini_4u");
More information about the llvm-commits
mailing list