mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-22 13:29:44 +00:00
[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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221619 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d342c4c748
commit
26e0544c0a
@ -9,27 +9,28 @@ tablegen(LLVM NVPTXGenSubtargetInfo.inc -gen-subtarget)
|
||||
add_public_tablegen_target(NVPTXCommonTableGen)
|
||||
|
||||
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
|
||||
NVPTXAsmPrinter.cpp
|
||||
NVPTXUtilities.cpp
|
||||
NVVMReflect.cpp
|
||||
NVPTXGenericToNVVM.cpp
|
||||
NVPTXAssignValidGlobalNames.cpp
|
||||
NVPTXPrologEpilogPass.cpp
|
||||
NVPTXMCExpr.cpp
|
||||
NVPTXReplaceImageHandles.cpp
|
||||
NVPTXFavorNonGenericAddrSpaces.cpp
|
||||
NVPTXFrameLowering.cpp
|
||||
NVPTXGenericToNVVM.cpp
|
||||
NVPTXISelDAGToDAG.cpp
|
||||
NVPTXISelLowering.cpp
|
||||
NVPTXImageOptimizer.cpp
|
||||
NVPTXInstrInfo.cpp
|
||||
NVPTXLowerAggrCopies.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})
|
||||
|
@ -59,6 +59,7 @@ inline static const char *NVPTXCondCodeToString(NVPTXCC::CondCodes CC) {
|
||||
llvm_unreachable("Unknown condition code");
|
||||
}
|
||||
|
||||
ImmutablePass *createNVPTXTargetTransformInfoPass(const NVPTXTargetMachine *TM);
|
||||
FunctionPass *
|
||||
createNVPTXISelDag(NVPTXTargetMachine &TM, llvm::CodeGenOpt::Level OptLevel);
|
||||
ModulePass *createNVPTXAssignValidGlobalNamesPass();
|
||||
|
@ -121,6 +121,14 @@ TargetPassConfig *NVPTXTargetMachine::createPassConfig(PassManagerBase &PM) {
|
||||
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() {
|
||||
// The following passes are known to not play well with virtual regs hanging
|
||||
// around after register allocation (which in our case, is *all* registers).
|
||||
|
@ -49,6 +49,9 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
/// \brief Register NVPTX analysis passes with a pass manager.
|
||||
void addAnalysisPasses(PassManagerBase &PM) override;
|
||||
|
||||
}; // NVPTXTargetMachine.
|
||||
|
||||
class NVPTXTargetMachine32 : public NVPTXTargetMachine {
|
||||
|
90
lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp
Normal file
90
lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp
Normal 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; }
|
Loading…
x
Reference in New Issue
Block a user