Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions llvm/lib/Target/X86/X86.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,14 @@ FunctionPass *createX86AvoidStoreForwardingBlocks();
FunctionPass *createX86FlagsCopyLoweringPass();

/// Return a pass that expands DynAlloca pseudo-instructions.
FunctionPass *createX86DynAllocaExpander();
class X86DynAllocaExpanderPass
: public PassInfoMixin<X86DynAllocaExpanderPass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};

FunctionPass *createX86DynAllocaExpanderLegacyPass();

/// Return a pass that config the tile registers.
FunctionPass *createX86TileConfigPass();
Expand Down Expand Up @@ -237,7 +244,7 @@ void initializeX86CallFrameOptimizationPass(PassRegistry &);
void initializeX86CmovConverterPassPass(PassRegistry &);
void initializeX86DAGToDAGISelLegacyPass(PassRegistry &);
void initializeX86DomainReassignmentPass(PassRegistry &);
void initializeX86DynAllocaExpanderPass(PassRegistry &);
void initializeX86DynAllocaExpanderLegacyPass(PassRegistry &);
void initializeX86ExecutionDomainFixPass(PassRegistry &);
void initializeX86ExpandPseudoPass(PassRegistry &);
void initializeX86FastPreTileConfigPass(PassRegistry &);
Expand Down
42 changes: 33 additions & 9 deletions llvm/lib/Target/X86/X86DynAllocaExpander.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,22 +20,22 @@
#include "X86Subtarget.h"
#include "llvm/ADT/MapVector.h"
#include "llvm/ADT/PostOrderIterator.h"
#include "llvm/CodeGen/MachineFunctionAnalysisManager.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
#include "llvm/IR/Analysis.h"
#include "llvm/IR/Function.h"

using namespace llvm;

namespace {

class X86DynAllocaExpander : public MachineFunctionPass {
class X86DynAllocaExpander {
public:
X86DynAllocaExpander() : MachineFunctionPass(ID) {}

bool runOnMachineFunction(MachineFunction &MF) override;
bool run(MachineFunction &MF);

private:
/// Strategies for lowering a DynAlloca.
Expand All @@ -61,22 +61,30 @@ class X86DynAllocaExpander : public MachineFunctionPass {
unsigned SlotSize = 0;
int64_t StackProbeSize = 0;
bool NoStackArgProbe = false;
};

class X86DynAllocaExpanderLegacy : public MachineFunctionPass {
public:
X86DynAllocaExpanderLegacy() : MachineFunctionPass(ID) {}

bool runOnMachineFunction(MachineFunction &MF) override;

private:
StringRef getPassName() const override { return "X86 DynAlloca Expander"; }

public:
static char ID;
};

char X86DynAllocaExpander::ID = 0;
char X86DynAllocaExpanderLegacy::ID = 0;

} // end anonymous namespace

INITIALIZE_PASS(X86DynAllocaExpander, "x86-dyn-alloca-expander",
INITIALIZE_PASS(X86DynAllocaExpanderLegacy, "x86-dyn-alloca-expander",
"X86 DynAlloca Expander", false, false)

FunctionPass *llvm::createX86DynAllocaExpander() {
return new X86DynAllocaExpander();
FunctionPass *llvm::createX86DynAllocaExpanderLegacyPass() {
return new X86DynAllocaExpanderLegacy();
}

/// Return the allocation amount for a DynAlloca instruction, or -1 if unknown.
Expand Down Expand Up @@ -277,7 +285,7 @@ void X86DynAllocaExpander::lower(MachineInstr *MI, Lowering L) {
AmountDef->eraseFromParent();
}

bool X86DynAllocaExpander::runOnMachineFunction(MachineFunction &MF) {
bool X86DynAllocaExpander::run(MachineFunction &MF) {
if (!MF.getInfo<X86MachineFunctionInfo>()->hasDynAlloca())
return false;

Expand All @@ -299,3 +307,19 @@ bool X86DynAllocaExpander::runOnMachineFunction(MachineFunction &MF) {

return true;
}

bool X86DynAllocaExpanderLegacy::runOnMachineFunction(MachineFunction &MF) {
return X86DynAllocaExpander().run(MF);
}

PreservedAnalyses
X86DynAllocaExpanderPass::run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM) {
bool Changed = X86DynAllocaExpander().run(MF);
if (!Changed)
return PreservedAnalyses::all();

PreservedAnalyses PA = PreservedAnalyses::none();
PA.preserveSet<CFGAnalyses>();
return PA;
}
2 changes: 1 addition & 1 deletion llvm/lib/Target/X86/X86PassRegistry.def
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ DUMMY_FUNCTION_PASS("x86-winehstate", WinEHStatePass())
#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS)
#endif
MACHINE_FUNCTION_PASS("x86-avoid-trailing-call", X86AvoidTrailingCallPass())
MACHINE_FUNCTION_PASS("x86-dyn-alloca-expander", X86DynAllocaExpanderPass())
MACHINE_FUNCTION_PASS("x86-isel", X86ISelDAGToDAGPass(*this))
#undef MACHINE_FUNCTION_PASS

Expand All @@ -42,7 +43,6 @@ DUMMY_MACHINE_FUNCTION_PASS("x86-cmov-conversion", X86CmovConverterPass())
DUMMY_MACHINE_FUNCTION_PASS("x86-codege", FPS())
DUMMY_MACHINE_FUNCTION_PASS("x86-compress-evex", CompressEVEXPass())
DUMMY_MACHINE_FUNCTION_PASS("x86-domain-reassignment", X86DomainReassignment())
DUMMY_MACHINE_FUNCTION_PASS("x86-dyn-alloca-expander", X86DynAllocaExpander())
DUMMY_MACHINE_FUNCTION_PASS("x86-execution-domain-fix", X86ExecutionDomainFix())
DUMMY_MACHINE_FUNCTION_PASS("fastpretileconfig", X86FastPreTileConfig())
DUMMY_MACHINE_FUNCTION_PASS("fasttileconfig", X86FastTileConfig())
Expand Down
4 changes: 2 additions & 2 deletions llvm/lib/Target/X86/X86TargetMachine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ extern "C" LLVM_C_ABI void LLVMInitializeX86Target() {
initializeX86AsmPrinterPass(PR);
initializeX86FixupInstTuningPassPass(PR);
initializeX86FixupVectorConstantsPassPass(PR);
initializeX86DynAllocaExpanderPass(PR);
initializeX86DynAllocaExpanderLegacyPass(PR);
initializeX86SuppressAPXForRelocationPassPass(PR);
initializeX86WinEHUnwindV2Pass(PR);
}
Expand Down Expand Up @@ -516,7 +516,7 @@ void X86PassConfig::addPreRegAlloc() {

addPass(createX86SpeculativeLoadHardeningPass());
addPass(createX86FlagsCopyLoweringPass());
addPass(createX86DynAllocaExpander());
addPass(createX86DynAllocaExpanderLegacyPass());

if (getOptLevel() != CodeGenOptLevel::None)
addPass(createX86PreTileConfigPass());
Expand Down
Loading