[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:
Jingyue Wu 2014-11-10 18:38:25 +00:00
parent 4aa6bea7a2
commit 0c981bd7df
5 changed files with 119 additions and 16 deletions

View File

@ -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})

View File

@ -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();

View File

@ -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).

View File

@ -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 {

View File

@ -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; }