From 88710c5a2eb8af36ee9ff4eb8c9987e72e3368e0 Mon Sep 17 00:00:00 2001 From: Anshul Nigham 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 { + 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(); 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(); + 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 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 { - private: +class X86AvoidTrailingCallPass + : public PassInfoMixin { +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(); return PA; } - From 03ee9f2edac245eae8f2d723f94b55e7f74c86a7 Mon Sep 17 00:00:00 2001 From: Anshul Nigham 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 { 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 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 { -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