[NVPTX] Add an NVPTX-specific TargetTransformInfo
Summary: It currently only implements hasBranchDivergence, and will be extended in later diffs. Split from D6188. Test Plan: make check-all Reviewers: jholewinski Reviewed By: jholewinski Subscribers: llvm-commits, meheff, eliben, jholewinski Differential Revision: http://reviews.llvm.org/D6195 llvm-svn: 221619
This commit is contained in:
parent
4aa6bea7a2
commit
0c981bd7df
|
@ -9,27 +9,28 @@ tablegen(LLVM NVPTXGenSubtargetInfo.inc -gen-subtarget)
|
||||||
add_public_tablegen_target(NVPTXCommonTableGen)
|
add_public_tablegen_target(NVPTXCommonTableGen)
|
||||||
|
|
||||||
set(NVPTXCodeGen_sources
|
set(NVPTXCodeGen_sources
|
||||||
NVPTXFavorNonGenericAddrSpaces.cpp
|
|
||||||
NVPTXFrameLowering.cpp
|
|
||||||
NVPTXInstrInfo.cpp
|
|
||||||
NVPTXISelDAGToDAG.cpp
|
|
||||||
NVPTXISelLowering.cpp
|
|
||||||
NVPTXRegisterInfo.cpp
|
|
||||||
NVPTXSubtarget.cpp
|
|
||||||
NVPTXTargetMachine.cpp
|
|
||||||
NVPTXLowerAggrCopies.cpp
|
|
||||||
NVPTXutil.cpp
|
|
||||||
NVPTXAllocaHoisting.cpp
|
NVPTXAllocaHoisting.cpp
|
||||||
NVPTXAsmPrinter.cpp
|
NVPTXAsmPrinter.cpp
|
||||||
NVPTXUtilities.cpp
|
|
||||||
NVVMReflect.cpp
|
|
||||||
NVPTXGenericToNVVM.cpp
|
|
||||||
NVPTXAssignValidGlobalNames.cpp
|
NVPTXAssignValidGlobalNames.cpp
|
||||||
NVPTXPrologEpilogPass.cpp
|
NVPTXFavorNonGenericAddrSpaces.cpp
|
||||||
NVPTXMCExpr.cpp
|
NVPTXFrameLowering.cpp
|
||||||
NVPTXReplaceImageHandles.cpp
|
NVPTXGenericToNVVM.cpp
|
||||||
|
NVPTXISelDAGToDAG.cpp
|
||||||
|
NVPTXISelLowering.cpp
|
||||||
NVPTXImageOptimizer.cpp
|
NVPTXImageOptimizer.cpp
|
||||||
|
NVPTXInstrInfo.cpp
|
||||||
|
NVPTXLowerAggrCopies.cpp
|
||||||
NVPTXLowerStructArgs.cpp
|
NVPTXLowerStructArgs.cpp
|
||||||
|
NVPTXMCExpr.cpp
|
||||||
|
NVPTXPrologEpilogPass.cpp
|
||||||
|
NVPTXRegisterInfo.cpp
|
||||||
|
NVPTXReplaceImageHandles.cpp
|
||||||
|
NVPTXSubtarget.cpp
|
||||||
|
NVPTXTargetMachine.cpp
|
||||||
|
NVPTXTargetTransformInfo.cpp
|
||||||
|
NVPTXUtilities.cpp
|
||||||
|
NVPTXutil.cpp
|
||||||
|
NVVMReflect.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
add_llvm_target(NVPTXCodeGen ${NVPTXCodeGen_sources})
|
add_llvm_target(NVPTXCodeGen ${NVPTXCodeGen_sources})
|
||||||
|
|
|
@ -59,6 +59,7 @@ inline static const char *NVPTXCondCodeToString(NVPTXCC::CondCodes CC) {
|
||||||
llvm_unreachable("Unknown condition code");
|
llvm_unreachable("Unknown condition code");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ImmutablePass *createNVPTXTargetTransformInfoPass(const NVPTXTargetMachine *TM);
|
||||||
FunctionPass *
|
FunctionPass *
|
||||||
createNVPTXISelDag(NVPTXTargetMachine &TM, llvm::CodeGenOpt::Level OptLevel);
|
createNVPTXISelDag(NVPTXTargetMachine &TM, llvm::CodeGenOpt::Level OptLevel);
|
||||||
ModulePass *createNVPTXAssignValidGlobalNamesPass();
|
ModulePass *createNVPTXAssignValidGlobalNamesPass();
|
||||||
|
|
|
@ -121,6 +121,14 @@ TargetPassConfig *NVPTXTargetMachine::createPassConfig(PassManagerBase &PM) {
|
||||||
return PassConfig;
|
return PassConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NVPTXTargetMachine::addAnalysisPasses(PassManagerBase &PM) {
|
||||||
|
// Add first the target-independent BasicTTI pass, then our NVPTX pass. This
|
||||||
|
// allows the NVPTX pass to delegate to the target independent layer when
|
||||||
|
// appropriate.
|
||||||
|
PM.add(createBasicTargetTransformInfoPass(this));
|
||||||
|
PM.add(createNVPTXTargetTransformInfoPass(this));
|
||||||
|
}
|
||||||
|
|
||||||
void NVPTXPassConfig::addIRPasses() {
|
void NVPTXPassConfig::addIRPasses() {
|
||||||
// The following passes are known to not play well with virtual regs hanging
|
// The following passes are known to not play well with virtual regs hanging
|
||||||
// around after register allocation (which in our case, is *all* registers).
|
// around after register allocation (which in our case, is *all* registers).
|
||||||
|
|
|
@ -49,6 +49,9 @@ public:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// \brief Register NVPTX analysis passes with a pass manager.
|
||||||
|
void addAnalysisPasses(PassManagerBase &PM) override;
|
||||||
|
|
||||||
}; // NVPTXTargetMachine.
|
}; // NVPTXTargetMachine.
|
||||||
|
|
||||||
class NVPTXTargetMachine32 : public NVPTXTargetMachine {
|
class NVPTXTargetMachine32 : public NVPTXTargetMachine {
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
//===-- NVPTXTargetTransformInfo.cpp - NVPTX specific TTI pass ---------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// \file
|
||||||
|
// This file implements a TargetTransformInfo analysis pass specific to the
|
||||||
|
// NVPTX target machine. It uses the target's detailed information to provide
|
||||||
|
// more precise answers to certain TTI queries, while letting the target
|
||||||
|
// independent and default TTI implementations handle the rest.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "NVPTXTargetMachine.h"
|
||||||
|
#include "llvm/Analysis/LoopInfo.h"
|
||||||
|
#include "llvm/Analysis/TargetTransformInfo.h"
|
||||||
|
#include "llvm/Analysis/ValueTracking.h"
|
||||||
|
#include "llvm/Support/Debug.h"
|
||||||
|
#include "llvm/Target/CostTable.h"
|
||||||
|
#include "llvm/Target/TargetLowering.h"
|
||||||
|
using namespace llvm;
|
||||||
|
|
||||||
|
#define DEBUG_TYPE "NVPTXtti"
|
||||||
|
|
||||||
|
// Declare the pass initialization routine locally as target-specific passes
|
||||||
|
// don't have a target-wide initialization entry point, and so we rely on the
|
||||||
|
// pass constructor initialization.
|
||||||
|
namespace llvm {
|
||||||
|
void initializeNVPTXTTIPass(PassRegistry &);
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
class NVPTXTTI final : public ImmutablePass, public TargetTransformInfo {
|
||||||
|
const NVPTXTargetMachine *TM;
|
||||||
|
const NVPTXSubtarget *ST;
|
||||||
|
const NVPTXTargetLowering *TLI;
|
||||||
|
|
||||||
|
/// Estimate the overhead of scalarizing an instruction. Insert and Extract
|
||||||
|
/// are set if the result needs to be inserted and/or extracted from vectors.
|
||||||
|
unsigned getScalarizationOverhead(Type *Ty, bool Insert, bool Extract) const;
|
||||||
|
|
||||||
|
public:
|
||||||
|
NVPTXTTI() : ImmutablePass(ID), TM(nullptr), ST(nullptr), TLI(nullptr) {
|
||||||
|
llvm_unreachable("This pass cannot be directly constructed");
|
||||||
|
}
|
||||||
|
|
||||||
|
NVPTXTTI(const NVPTXTargetMachine *TM)
|
||||||
|
: ImmutablePass(ID), TM(TM), ST(TM->getSubtargetImpl()),
|
||||||
|
TLI(TM->getSubtargetImpl()->getTargetLowering()) {
|
||||||
|
initializeNVPTXTTIPass(*PassRegistry::getPassRegistry());
|
||||||
|
}
|
||||||
|
|
||||||
|
void initializePass() override { pushTTIStack(this); }
|
||||||
|
|
||||||
|
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||||
|
TargetTransformInfo::getAnalysisUsage(AU);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Pass identification.
|
||||||
|
static char ID;
|
||||||
|
|
||||||
|
/// Provide necessary pointer adjustments for the two base classes.
|
||||||
|
void *getAdjustedAnalysisPointer(const void *ID) override {
|
||||||
|
if (ID == &TargetTransformInfo::ID)
|
||||||
|
return (TargetTransformInfo *)this;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool hasBranchDivergence() const override;
|
||||||
|
|
||||||
|
/// @}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // end anonymous namespace
|
||||||
|
|
||||||
|
INITIALIZE_AG_PASS(NVPTXTTI, TargetTransformInfo, "NVPTXtti",
|
||||||
|
"NVPTX Target Transform Info", true, true, false)
|
||||||
|
char NVPTXTTI::ID = 0;
|
||||||
|
|
||||||
|
ImmutablePass *
|
||||||
|
llvm::createNVPTXTargetTransformInfoPass(const NVPTXTargetMachine *TM) {
|
||||||
|
return new NVPTXTTI(TM);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool NVPTXTTI::hasBranchDivergence() const { return true; }
|
Loading…
Reference in New Issue