[llvm] [X86] [NewPM] Add New Pass Manager wiring for x86-avoid-trailing-call (PR #166723)
Anshul Nigham via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 6 20:07:19 PST 2025
https://github.com/nigham updated https://github.com/llvm/llvm-project/pull/166723
>From 88710c5a2eb8af36ee9ff4eb8c9987e72e3368e0 Mon Sep 17 00:00:00 2001
From: Anshul Nigham <nigham at google.com>
Date: Thu, 6 Nov 2025 07:22:49 +0000
Subject: [PATCH 1/4] Migrate x86-avoid-trailing-call to New Pass Manager,
initial code, pending tests.
---
llvm/lib/Target/X86/X86.h | 15 +++++++--
llvm/lib/Target/X86/X86AvoidTrailingCall.cpp | 32 +++++++++++++++-----
llvm/lib/Target/X86/X86PassRegistry.def | 2 +-
llvm/lib/Target/X86/X86TargetMachine.cpp | 4 +--
4 files changed, 41 insertions(+), 12 deletions(-)
diff --git a/llvm/lib/Target/X86/X86.h b/llvm/lib/Target/X86/X86.h
index fa23656e23fc3..433941ae3938e 100644
--- a/llvm/lib/Target/X86/X86.h
+++ b/llvm/lib/Target/X86/X86.h
@@ -14,6 +14,7 @@
#ifndef LLVM_LIB_TARGET_X86_X86_H
#define LLVM_LIB_TARGET_X86_X86_H
+#include "llvm/CodeGen/MachineFunctionAnalysisManager.h"
#include "llvm/IR/Analysis.h"
#include "llvm/IR/PassManager.h"
#include "llvm/Support/CodeGen.h"
@@ -104,7 +105,17 @@ FunctionPass *createX86LowerTileCopyPass();
/// CALL instruction. The pass does the same for each funclet as well. This
/// ensures that the open interval of function start and end PCs contains all
/// return addresses for the benefit of the Windows x64 unwinder.
-FunctionPass *createX86AvoidTrailingCallPass();
+class X86AvoidTrailingCallPass : public PassInfoMixin<X86AvoidTrailingCallPass> {
+ private:
+ const TargetMachine *TM;
+
+ public:
+ X86AvoidTrailingCallPass(const TargetMachine *TM) : TM(TM) {}
+ PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM);
+ static bool isRequired() { return true; }
+};
+
+FunctionPass *createX86AvoidTrailingCallLegacyPass();
/// Return a pass that optimizes the code-size of x86 call sequences. This is
/// done by replacing esp-relative movs with pushes.
@@ -222,7 +233,7 @@ void initializeX86FixupInstTuningPassPass(PassRegistry &);
void initializeX86FixupVectorConstantsPassPass(PassRegistry &);
void initializeWinEHStatePassPass(PassRegistry &);
void initializeX86AvoidSFBPassPass(PassRegistry &);
-void initializeX86AvoidTrailingCallPassPass(PassRegistry &);
+void initializeX86AvoidTrailingCallLegacyPassPass(PassRegistry &);
void initializeX86CallFrameOptimizationPass(PassRegistry &);
void initializeX86CmovConverterPassPass(PassRegistry &);
void initializeX86DAGToDAGISelLegacyPass(PassRegistry &);
diff --git a/llvm/lib/Target/X86/X86AvoidTrailingCall.cpp b/llvm/lib/Target/X86/X86AvoidTrailingCall.cpp
index 2ecf49382d29f..56d05d4eee738 100644
--- a/llvm/lib/Target/X86/X86AvoidTrailingCall.cpp
+++ b/llvm/lib/Target/X86/X86AvoidTrailingCall.cpp
@@ -37,6 +37,8 @@
#include "X86Subtarget.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
+#include "llvm/IR/Analysis.h"
+#include "llvm/IR/PassManager.h"
#define AVOIDCALL_DESC "X86 avoid trailing call pass"
#define AVOIDCALL_NAME "x86-avoid-trailing-call"
@@ -46,9 +48,9 @@
using namespace llvm;
namespace {
-class X86AvoidTrailingCallPass : public MachineFunctionPass {
+class X86AvoidTrailingCallLegacyPass : public MachineFunctionPass {
public:
- X86AvoidTrailingCallPass() : MachineFunctionPass(ID) {}
+ X86AvoidTrailingCallLegacyPass() : MachineFunctionPass(ID) {}
bool runOnMachineFunction(MachineFunction &MF) override;
@@ -59,13 +61,13 @@ class X86AvoidTrailingCallPass : public MachineFunctionPass {
};
} // end anonymous namespace
-char X86AvoidTrailingCallPass::ID = 0;
+char X86AvoidTrailingCallLegacyPass::ID = 0;
-FunctionPass *llvm::createX86AvoidTrailingCallPass() {
- return new X86AvoidTrailingCallPass();
+FunctionPass *llvm::createX86AvoidTrailingCallLegacyPass() {
+ return new X86AvoidTrailingCallLegacyPass();
}
-INITIALIZE_PASS(X86AvoidTrailingCallPass, AVOIDCALL_NAME, AVOIDCALL_DESC, false, false)
+INITIALIZE_PASS(X86AvoidTrailingCallLegacyPass, AVOIDCALL_NAME, AVOIDCALL_DESC, false, false)
// A real instruction is a non-meta, non-pseudo instruction. Some pseudos
// expand to nothing, and some expand to code. This logic conservatively assumes
@@ -79,7 +81,7 @@ static bool isCallInstruction(const MachineInstr &MI) {
return MI.isCall() && !MI.isReturn();
}
-bool X86AvoidTrailingCallPass::runOnMachineFunction(MachineFunction &MF) {
+bool UpdatedOnX86AvoidTrailingCallPass(MachineFunction &MF) {
const X86Subtarget &STI = MF.getSubtarget<X86Subtarget>();
const X86InstrInfo &TII = *STI.getInstrInfo();
assert(STI.isTargetWin64() && "pass only runs on Win64");
@@ -134,3 +136,19 @@ bool X86AvoidTrailingCallPass::runOnMachineFunction(MachineFunction &MF) {
return Changed;
}
+
+bool X86AvoidTrailingCallLegacyPass::runOnMachineFunction(MachineFunction &MF) {
+ return UpdatedOnX86AvoidTrailingCallPass(MF);
+}
+
+PreservedAnalyses X86AvoidTrailingCallPass::run(
+ MachineFunction &MF, MachineFunctionAnalysisManager &MFAM) {
+ bool Changed = UpdatedOnX86AvoidTrailingCallPass(MF);
+ if (!Changed)
+ return PreservedAnalyses::all();
+
+ PreservedAnalyses PA = PreservedAnalyses::none();
+ PA.preserveSet<CFGAnalyses>();
+ return PA;
+}
+
diff --git a/llvm/lib/Target/X86/X86PassRegistry.def b/llvm/lib/Target/X86/X86PassRegistry.def
index db255940f8829..65b5d9bab0a37 100644
--- a/llvm/lib/Target/X86/X86PassRegistry.def
+++ b/llvm/lib/Target/X86/X86PassRegistry.def
@@ -30,13 +30,13 @@ DUMMY_FUNCTION_PASS("x86-winehstate", WinEHStatePass())
#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS)
#endif
MACHINE_FUNCTION_PASS("x86-isel", X86ISelDAGToDAGPass(*this))
+MACHINE_FUNCTION_PASS("x86-avoid-trailing-call", X86AvoidTrailingCallPass(this))
#undef MACHINE_FUNCTION_PASS
#ifndef DUMMY_MACHINE_FUNCTION_PASS
#define DUMMY_MACHINE_FUNCTION_PASS(NAME, PASS_NAME)
#endif
DUMMY_MACHINE_FUNCTION_PASS("x86-avoid-SFB", X86AvoidSFBPass())
-DUMMY_MACHINE_FUNCTION_PASS("x86-avoid-trailing-call", X86AvoidTrailingCallPass())
DUMMY_MACHINE_FUNCTION_PASS("x86-cf-opt", X86CallFrameOptimization())
DUMMY_MACHINE_FUNCTION_PASS("x86-cmov-conversion", X86CmovConverterPass())
DUMMY_MACHINE_FUNCTION_PASS("x86-codege", FPS())
diff --git a/llvm/lib/Target/X86/X86TargetMachine.cpp b/llvm/lib/Target/X86/X86TargetMachine.cpp
index 5f0bcab251e61..0c2bd7c302f33 100644
--- a/llvm/lib/Target/X86/X86TargetMachine.cpp
+++ b/llvm/lib/Target/X86/X86TargetMachine.cpp
@@ -90,7 +90,7 @@ extern "C" LLVM_C_ABI void LLVMInitializeX86Target() {
initializeX86ExecutionDomainFixPass(PR);
initializeX86DomainReassignmentPass(PR);
initializeX86AvoidSFBPassPass(PR);
- initializeX86AvoidTrailingCallPassPass(PR);
+ initializeX86AvoidTrailingCallLegacyPassPass(PR);
initializeX86SpeculativeLoadHardeningPassPass(PR);
initializeX86SpeculativeExecutionSideEffectSuppressionPass(PR);
initializeX86FlagsCopyLoweringPassPass(PR);
@@ -589,7 +589,7 @@ void X86PassConfig::addPreEmitPass2() {
// Insert extra int3 instructions after trailing call instructions to avoid
// issues in the unwinder.
if (TT.isOSWindows() && TT.isX86_64())
- addPass(createX86AvoidTrailingCallPass());
+ addPass(createX86AvoidTrailingCallLegacyPass());
// Verify basic block incoming and outgoing cfa offset and register values and
// correct CFA calculation rule where needed by inserting appropriate CFI
>From 0ba4ae27f6688ad89ea4d9ffc6cd92a31232e511 Mon Sep 17 00:00:00 2001
From: Anshul Nigham <nigham at google.com>
Date: Fri, 7 Nov 2025 00:52:56 +0000
Subject: [PATCH 2/4] clang-format
---
llvm/lib/Target/X86/X86.h | 10 ++++++----
llvm/lib/Target/X86/X86AvoidTrailingCall.cpp | 9 +++++----
2 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/llvm/lib/Target/X86/X86.h b/llvm/lib/Target/X86/X86.h
index 433941ae3938e..3a8527eb37592 100644
--- a/llvm/lib/Target/X86/X86.h
+++ b/llvm/lib/Target/X86/X86.h
@@ -105,13 +105,15 @@ FunctionPass *createX86LowerTileCopyPass();
/// CALL instruction. The pass does the same for each funclet as well. This
/// ensures that the open interval of function start and end PCs contains all
/// return addresses for the benefit of the Windows x64 unwinder.
-class X86AvoidTrailingCallPass : public PassInfoMixin<X86AvoidTrailingCallPass> {
- private:
+class X86AvoidTrailingCallPass
+ : public PassInfoMixin<X86AvoidTrailingCallPass> {
+private:
const TargetMachine *TM;
- public:
+public:
X86AvoidTrailingCallPass(const TargetMachine *TM) : TM(TM) {}
- PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM);
+ PreservedAnalyses run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM);
static bool isRequired() { return true; }
};
diff --git a/llvm/lib/Target/X86/X86AvoidTrailingCall.cpp b/llvm/lib/Target/X86/X86AvoidTrailingCall.cpp
index 56d05d4eee738..ebd4284f0f37d 100644
--- a/llvm/lib/Target/X86/X86AvoidTrailingCall.cpp
+++ b/llvm/lib/Target/X86/X86AvoidTrailingCall.cpp
@@ -67,7 +67,8 @@ FunctionPass *llvm::createX86AvoidTrailingCallLegacyPass() {
return new X86AvoidTrailingCallLegacyPass();
}
-INITIALIZE_PASS(X86AvoidTrailingCallLegacyPass, AVOIDCALL_NAME, AVOIDCALL_DESC, false, false)
+INITIALIZE_PASS(X86AvoidTrailingCallLegacyPass, AVOIDCALL_NAME, AVOIDCALL_DESC,
+ false, false)
// A real instruction is a non-meta, non-pseudo instruction. Some pseudos
// expand to nothing, and some expand to code. This logic conservatively assumes
@@ -141,8 +142,9 @@ bool X86AvoidTrailingCallLegacyPass::runOnMachineFunction(MachineFunction &MF) {
return UpdatedOnX86AvoidTrailingCallPass(MF);
}
-PreservedAnalyses X86AvoidTrailingCallPass::run(
- MachineFunction &MF, MachineFunctionAnalysisManager &MFAM) {
+PreservedAnalyses
+X86AvoidTrailingCallPass::run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM) {
bool Changed = UpdatedOnX86AvoidTrailingCallPass(MF);
if (!Changed)
return PreservedAnalyses::all();
@@ -151,4 +153,3 @@ PreservedAnalyses X86AvoidTrailingCallPass::run(
PA.preserveSet<CFGAnalyses>();
return PA;
}
-
>From 03ee9f2edac245eae8f2d723f94b55e7f74c86a7 Mon Sep 17 00:00:00 2001
From: Anshul Nigham <nigham at google.com>
Date: Fri, 7 Nov 2025 01:14:55 +0000
Subject: [PATCH 3/4] Addressed review comments:
s/TargetMachine/X86TargetMachine/ and alphabetical ordering of machine pass
registry.
---
llvm/lib/Target/X86/X86.h | 4 ++--
llvm/lib/Target/X86/X86PassRegistry.def | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/Target/X86/X86.h b/llvm/lib/Target/X86/X86.h
index 3a8527eb37592..60959999cd688 100644
--- a/llvm/lib/Target/X86/X86.h
+++ b/llvm/lib/Target/X86/X86.h
@@ -108,10 +108,10 @@ FunctionPass *createX86LowerTileCopyPass();
class X86AvoidTrailingCallPass
: public PassInfoMixin<X86AvoidTrailingCallPass> {
private:
- const TargetMachine *TM;
+ const X86TargetMachine *TM;
public:
- X86AvoidTrailingCallPass(const TargetMachine *TM) : TM(TM) {}
+ X86AvoidTrailingCallPass(const X86TargetMachine *TM) : TM(TM) {}
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
static bool isRequired() { return true; }
diff --git a/llvm/lib/Target/X86/X86PassRegistry.def b/llvm/lib/Target/X86/X86PassRegistry.def
index 65b5d9bab0a37..e234d09d8fb1b 100644
--- a/llvm/lib/Target/X86/X86PassRegistry.def
+++ b/llvm/lib/Target/X86/X86PassRegistry.def
@@ -29,8 +29,8 @@ DUMMY_FUNCTION_PASS("x86-winehstate", WinEHStatePass())
#ifndef MACHINE_FUNCTION_PASS
#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS)
#endif
-MACHINE_FUNCTION_PASS("x86-isel", X86ISelDAGToDAGPass(*this))
MACHINE_FUNCTION_PASS("x86-avoid-trailing-call", X86AvoidTrailingCallPass(this))
+MACHINE_FUNCTION_PASS("x86-isel", X86ISelDAGToDAGPass(*this))
#undef MACHINE_FUNCTION_PASS
#ifndef DUMMY_MACHINE_FUNCTION_PASS
>From e355529cae91ff9c3d21c4752ccf178dfdd3a935 Mon Sep 17 00:00:00 2001
From: Anshul Nigham <nigham at google.com>
Date: Fri, 7 Nov 2025 04:07:02 +0000
Subject: [PATCH 4/4] Remove unused member TM from X86AvoidTrailingCallPass
---
llvm/lib/Target/X86/X86.h | 5 +----
llvm/lib/Target/X86/X86PassRegistry.def | 2 +-
2 files changed, 2 insertions(+), 5 deletions(-)
diff --git a/llvm/lib/Target/X86/X86.h b/llvm/lib/Target/X86/X86.h
index 60959999cd688..2b83d575ace91 100644
--- a/llvm/lib/Target/X86/X86.h
+++ b/llvm/lib/Target/X86/X86.h
@@ -107,11 +107,8 @@ FunctionPass *createX86LowerTileCopyPass();
/// return addresses for the benefit of the Windows x64 unwinder.
class X86AvoidTrailingCallPass
: public PassInfoMixin<X86AvoidTrailingCallPass> {
-private:
- const X86TargetMachine *TM;
-
public:
- X86AvoidTrailingCallPass(const X86TargetMachine *TM) : TM(TM) {}
+ X86AvoidTrailingCallPass() = default;
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
static bool isRequired() { return true; }
diff --git a/llvm/lib/Target/X86/X86PassRegistry.def b/llvm/lib/Target/X86/X86PassRegistry.def
index e234d09d8fb1b..52463622026d7 100644
--- a/llvm/lib/Target/X86/X86PassRegistry.def
+++ b/llvm/lib/Target/X86/X86PassRegistry.def
@@ -29,7 +29,7 @@ DUMMY_FUNCTION_PASS("x86-winehstate", WinEHStatePass())
#ifndef MACHINE_FUNCTION_PASS
#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS)
#endif
-MACHINE_FUNCTION_PASS("x86-avoid-trailing-call", X86AvoidTrailingCallPass(this))
+MACHINE_FUNCTION_PASS("x86-avoid-trailing-call", X86AvoidTrailingCallPass())
MACHINE_FUNCTION_PASS("x86-isel", X86ISelDAGToDAGPass(*this))
#undef MACHINE_FUNCTION_PASS
More information about the llvm-commits
mailing list