Skip to content

Commit 40c89e5

Browse files
authored
[X86][NewPM] Add New Pass Manager wiring for x86-avoid-trailing-call (#166723)
1 parent 28fdda6 commit 40c89e5

File tree

4 files changed

+41
-12
lines changed

4 files changed

+41
-12
lines changed

llvm/lib/Target/X86/X86.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#ifndef LLVM_LIB_TARGET_X86_X86_H
1515
#define LLVM_LIB_TARGET_X86_X86_H
1616

17+
#include "llvm/CodeGen/MachineFunctionAnalysisManager.h"
1718
#include "llvm/IR/Analysis.h"
1819
#include "llvm/IR/PassManager.h"
1920
#include "llvm/Support/CodeGen.h"
@@ -104,7 +105,16 @@ FunctionPass *createX86LowerTileCopyPass();
104105
/// CALL instruction. The pass does the same for each funclet as well. This
105106
/// ensures that the open interval of function start and end PCs contains all
106107
/// return addresses for the benefit of the Windows x64 unwinder.
107-
FunctionPass *createX86AvoidTrailingCallPass();
108+
class X86AvoidTrailingCallPass
109+
: public PassInfoMixin<X86AvoidTrailingCallPass> {
110+
public:
111+
X86AvoidTrailingCallPass() = default;
112+
PreservedAnalyses run(MachineFunction &MF,
113+
MachineFunctionAnalysisManager &MFAM);
114+
static bool isRequired() { return true; }
115+
};
116+
117+
FunctionPass *createX86AvoidTrailingCallLegacyPass();
108118

109119
/// Return a pass that optimizes the code-size of x86 call sequences. This is
110120
/// done by replacing esp-relative movs with pushes.
@@ -222,7 +232,7 @@ void initializeX86FixupInstTuningPassPass(PassRegistry &);
222232
void initializeX86FixupVectorConstantsPassPass(PassRegistry &);
223233
void initializeWinEHStatePassPass(PassRegistry &);
224234
void initializeX86AvoidSFBPassPass(PassRegistry &);
225-
void initializeX86AvoidTrailingCallPassPass(PassRegistry &);
235+
void initializeX86AvoidTrailingCallLegacyPassPass(PassRegistry &);
226236
void initializeX86CallFrameOptimizationPass(PassRegistry &);
227237
void initializeX86CmovConverterPassPass(PassRegistry &);
228238
void initializeX86DAGToDAGISelLegacyPass(PassRegistry &);

llvm/lib/Target/X86/X86AvoidTrailingCall.cpp

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
#include "X86Subtarget.h"
3838
#include "llvm/CodeGen/MachineFunctionPass.h"
3939
#include "llvm/CodeGen/MachineInstrBuilder.h"
40+
#include "llvm/IR/Analysis.h"
41+
#include "llvm/IR/PassManager.h"
4042

4143
#define AVOIDCALL_DESC "X86 avoid trailing call pass"
4244
#define AVOIDCALL_NAME "x86-avoid-trailing-call"
@@ -46,9 +48,9 @@
4648
using namespace llvm;
4749

4850
namespace {
49-
class X86AvoidTrailingCallPass : public MachineFunctionPass {
51+
class X86AvoidTrailingCallLegacyPass : public MachineFunctionPass {
5052
public:
51-
X86AvoidTrailingCallPass() : MachineFunctionPass(ID) {}
53+
X86AvoidTrailingCallLegacyPass() : MachineFunctionPass(ID) {}
5254

5355
bool runOnMachineFunction(MachineFunction &MF) override;
5456

@@ -59,13 +61,14 @@ class X86AvoidTrailingCallPass : public MachineFunctionPass {
5961
};
6062
} // end anonymous namespace
6163

62-
char X86AvoidTrailingCallPass::ID = 0;
64+
char X86AvoidTrailingCallLegacyPass::ID = 0;
6365

64-
FunctionPass *llvm::createX86AvoidTrailingCallPass() {
65-
return new X86AvoidTrailingCallPass();
66+
FunctionPass *llvm::createX86AvoidTrailingCallLegacyPass() {
67+
return new X86AvoidTrailingCallLegacyPass();
6668
}
6769

68-
INITIALIZE_PASS(X86AvoidTrailingCallPass, AVOIDCALL_NAME, AVOIDCALL_DESC, false, false)
70+
INITIALIZE_PASS(X86AvoidTrailingCallLegacyPass, AVOIDCALL_NAME, AVOIDCALL_DESC,
71+
false, false)
6972

7073
// A real instruction is a non-meta, non-pseudo instruction. Some pseudos
7174
// expand to nothing, and some expand to code. This logic conservatively assumes
@@ -79,7 +82,7 @@ static bool isCallInstruction(const MachineInstr &MI) {
7982
return MI.isCall() && !MI.isReturn();
8083
}
8184

82-
bool X86AvoidTrailingCallPass::runOnMachineFunction(MachineFunction &MF) {
85+
bool UpdatedOnX86AvoidTrailingCallPass(MachineFunction &MF) {
8386
const X86Subtarget &STI = MF.getSubtarget<X86Subtarget>();
8487
const X86InstrInfo &TII = *STI.getInstrInfo();
8588
assert(STI.isTargetWin64() && "pass only runs on Win64");
@@ -134,3 +137,19 @@ bool X86AvoidTrailingCallPass::runOnMachineFunction(MachineFunction &MF) {
134137

135138
return Changed;
136139
}
140+
141+
bool X86AvoidTrailingCallLegacyPass::runOnMachineFunction(MachineFunction &MF) {
142+
return UpdatedOnX86AvoidTrailingCallPass(MF);
143+
}
144+
145+
PreservedAnalyses
146+
X86AvoidTrailingCallPass::run(MachineFunction &MF,
147+
MachineFunctionAnalysisManager &MFAM) {
148+
bool Changed = UpdatedOnX86AvoidTrailingCallPass(MF);
149+
if (!Changed)
150+
return PreservedAnalyses::all();
151+
152+
PreservedAnalyses PA = PreservedAnalyses::none();
153+
PA.preserveSet<CFGAnalyses>();
154+
return PA;
155+
}

llvm/lib/Target/X86/X86PassRegistry.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@ DUMMY_FUNCTION_PASS("x86-winehstate", WinEHStatePass())
2929
#ifndef MACHINE_FUNCTION_PASS
3030
#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS)
3131
#endif
32+
MACHINE_FUNCTION_PASS("x86-avoid-trailing-call", X86AvoidTrailingCallPass())
3233
MACHINE_FUNCTION_PASS("x86-isel", X86ISelDAGToDAGPass(*this))
3334
#undef MACHINE_FUNCTION_PASS
3435

3536
#ifndef DUMMY_MACHINE_FUNCTION_PASS
3637
#define DUMMY_MACHINE_FUNCTION_PASS(NAME, PASS_NAME)
3738
#endif
3839
DUMMY_MACHINE_FUNCTION_PASS("x86-avoid-SFB", X86AvoidSFBPass())
39-
DUMMY_MACHINE_FUNCTION_PASS("x86-avoid-trailing-call", X86AvoidTrailingCallPass())
4040
DUMMY_MACHINE_FUNCTION_PASS("x86-cf-opt", X86CallFrameOptimization())
4141
DUMMY_MACHINE_FUNCTION_PASS("x86-cmov-conversion", X86CmovConverterPass())
4242
DUMMY_MACHINE_FUNCTION_PASS("x86-codege", FPS())

llvm/lib/Target/X86/X86TargetMachine.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ extern "C" LLVM_C_ABI void LLVMInitializeX86Target() {
9090
initializeX86ExecutionDomainFixPass(PR);
9191
initializeX86DomainReassignmentPass(PR);
9292
initializeX86AvoidSFBPassPass(PR);
93-
initializeX86AvoidTrailingCallPassPass(PR);
93+
initializeX86AvoidTrailingCallLegacyPassPass(PR);
9494
initializeX86SpeculativeLoadHardeningPassPass(PR);
9595
initializeX86SpeculativeExecutionSideEffectSuppressionPass(PR);
9696
initializeX86FlagsCopyLoweringPassPass(PR);
@@ -589,7 +589,7 @@ void X86PassConfig::addPreEmitPass2() {
589589
// Insert extra int3 instructions after trailing call instructions to avoid
590590
// issues in the unwinder.
591591
if (TT.isOSWindows() && TT.isX86_64())
592-
addPass(createX86AvoidTrailingCallPass());
592+
addPass(createX86AvoidTrailingCallLegacyPass());
593593

594594
// Verify basic block incoming and outgoing cfa offset and register values and
595595
// correct CFA calculation rule where needed by inserting appropriate CFI

0 commit comments

Comments
 (0)