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
13 changes: 11 additions & 2 deletions llvm/lib/Target/X86/X86.h
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,16 @@ FunctionPass *createX86InsertX87waitPass();
/// This pass optimizes arithmetic based on knowledge that is only used by
/// a reduction sequence and is therefore safe to reassociate in interesting
/// ways.
FunctionPass *createX86PartialReductionPass();
class X86PartialReductionPass : public PassInfoMixin<X86PartialReductionPass> {
private:
const X86TargetMachine *TM;

public:
X86PartialReductionPass(const X86TargetMachine *TM) : TM(TM) {}
PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM);
};

FunctionPass *createX86PartialReductionLegacyPass();

/// // Analyzes and emits pseudos to support Win x64 Unwind V2.
FunctionPass *createX86WinEHUnwindV2Pass();
Expand Down Expand Up @@ -231,7 +240,7 @@ void initializeX86LowerAMXIntrinsicsLegacyPassPass(PassRegistry &);
void initializeX86LowerAMXTypeLegacyPassPass(PassRegistry &);
void initializeX86LowerTileCopyPass(PassRegistry &);
void initializeX86OptimizeLEAPassPass(PassRegistry &);
void initializeX86PartialReductionPass(PassRegistry &);
void initializeX86PartialReductionLegacyPass(PassRegistry &);
void initializeX86PreTileConfigPass(PassRegistry &);
void initializeX86ReturnThunksPass(PassRegistry &);
void initializeX86SpeculativeExecutionSideEffectSuppressionPass(PassRegistry &);
Expand Down
72 changes: 46 additions & 26 deletions llvm/lib/Target/X86/X86PartialReduction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@
#include "X86TargetMachine.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/CodeGen/TargetPassConfig.h"
#include "llvm/IR/Analysis.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicsX86.h"
#include "llvm/IR/PassManager.h"
#include "llvm/IR/PatternMatch.h"
#include "llvm/Pass.h"
#include "llvm/Support/KnownBits.h"
Expand All @@ -30,39 +32,44 @@ using namespace llvm;

namespace {

class X86PartialReduction : public FunctionPass {
class X86PartialReduction {
const X86TargetMachine *TM;
const DataLayout *DL = nullptr;
const X86Subtarget *ST = nullptr;

public:
X86PartialReduction(const X86TargetMachine *TM) : TM(TM) {}
bool run(Function &F);

private:
bool tryMAddReplacement(Instruction *Op, bool ReduceInOneBB);
bool trySADReplacement(Instruction *Op);
};

class X86PartialReductionLegacy : public FunctionPass {
public:
static char ID; // Pass identification, replacement for typeid.

X86PartialReduction() : FunctionPass(ID) { }
X86PartialReductionLegacy() : FunctionPass(ID) {}

bool runOnFunction(Function &Fn) override;
bool runOnFunction(Function &F) override;

void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.setPreservesCFG();
}

StringRef getPassName() const override {
return "X86 Partial Reduction";
}

private:
bool tryMAddReplacement(Instruction *Op, bool ReduceInOneBB);
bool trySADReplacement(Instruction *Op);
StringRef getPassName() const override { return "X86 Partial Reduction"; }
};
}

FunctionPass *llvm::createX86PartialReductionPass() {
return new X86PartialReduction();
FunctionPass *llvm::createX86PartialReductionLegacyPass() {
return new X86PartialReductionLegacy();
}

char X86PartialReduction::ID = 0;
char X86PartialReductionLegacy::ID = 0;

INITIALIZE_PASS(X86PartialReduction, DEBUG_TYPE,
"X86 Partial Reduction", false, false)
INITIALIZE_PASS(X86PartialReductionLegacy, DEBUG_TYPE, "X86 Partial Reduction",
false, false)

// This function should be aligned with detectExtMul() in X86ISelLowering.cpp.
static bool matchVPDPBUSDPattern(const X86Subtarget *ST, BinaryOperator *Mul,
Expand Down Expand Up @@ -494,17 +501,8 @@ static void collectLeaves(Value *Root, SmallVectorImpl<Instruction *> &Leaves) {
}
}

bool X86PartialReduction::runOnFunction(Function &F) {
if (skipFunction(F))
return false;

auto *TPC = getAnalysisIfAvailable<TargetPassConfig>();
if (!TPC)
return false;

auto &TM = TPC->getTM<X86TargetMachine>();
ST = TM.getSubtargetImpl(F);

bool X86PartialReduction::run(Function &F) {
ST = TM->getSubtargetImpl(F);
DL = &F.getDataLayout();

bool MadeChange = false;
Expand Down Expand Up @@ -540,3 +538,25 @@ bool X86PartialReduction::runOnFunction(Function &F) {

return MadeChange;
}

bool X86PartialReductionLegacy::runOnFunction(Function &F) {
if (skipFunction(F))
return false;

auto *TPC = getAnalysisIfAvailable<TargetPassConfig>();
if (!TPC)
return false;

return X86PartialReduction(&TPC->getTM<X86TargetMachine>()).run(F);
}

PreservedAnalyses X86PartialReductionPass::run(Function &F,
FunctionAnalysisManager &FAM) {
bool Changed = X86PartialReduction(TM).run(F);
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 @@ -17,12 +17,12 @@
#endif
FUNCTION_PASS("x86-lower-amx-intrinsics", X86LowerAMXIntrinsicsPass(this))
FUNCTION_PASS("x86-lower-amx-type", X86LowerAMXTypePass(this))
FUNCTION_PASS("x86-partial-reduction", X86PartialReductionPass(this))
#undef FUNCTION_PASS

#ifndef DUMMY_FUNCTION_PASS
#define DUMMY_FUNCTION_PASS(NAME, CREATE_PASS)
#endif
DUMMY_FUNCTION_PASS("x86-partial-reduction", X86PartialReduction())
DUMMY_FUNCTION_PASS("x86-winehstate", WinEHStatePass())
#undef DUMMY_FUNCTION_PASS

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 @@ -97,7 +97,7 @@ extern "C" LLVM_C_ABI void LLVMInitializeX86Target() {
initializeX86LoadValueInjectionLoadHardeningPassPass(PR);
initializeX86LoadValueInjectionRetHardeningPassPass(PR);
initializeX86OptimizeLEAPassPass(PR);
initializeX86PartialReductionPass(PR);
initializeX86PartialReductionLegacyPass(PR);
initializePseudoProbeInserterPass(PR);
initializeX86ReturnThunksPass(PR);
initializeX86DAGToDAGISelLegacyPass(PR);
Expand Down Expand Up @@ -429,7 +429,7 @@ void X86PassConfig::addIRPasses() {

if (TM->getOptLevel() != CodeGenOptLevel::None) {
addPass(createInterleavedAccessPass());
addPass(createX86PartialReductionPass());
addPass(createX86PartialReductionLegacyPass());
}

// Add passes that handle indirect branch removal and insertion of a retpoline
Expand Down
Loading