From 26e0544c0a5a3b532396c276068c3c90c990088c Mon Sep 17 00:00:00 2001 From: Jingyue Wu Date: Mon, 10 Nov 2014 18:38:25 +0000 Subject: [PATCH] [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 --- lib/Target/NVPTX/CMakeLists.txt | 25 +++--- lib/Target/NVPTX/NVPTX.h | 1 + lib/Target/NVPTX/NVPTXTargetMachine.cpp | 8 ++ lib/Target/NVPTX/NVPTXTargetMachine.h | 3 + lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp | 90 +++++++++++++++++++ 5 files changed, 115 insertions(+), 12 deletions(-) create mode 100644 lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp diff --git a/lib/Target/NVPTX/CMakeLists.txt b/lib/Target/NVPTX/CMakeLists.txt index 6b196ef6150..3a4a19dc399 100644 --- a/lib/Target/NVPTX/CMakeLists.txt +++ b/lib/Target/NVPTX/CMakeLists.txt @@ -9,27 +9,28 @@ tablegen(LLVM NVPTXGenSubtargetInfo.inc -gen-subtarget) add_public_tablegen_target(NVPTXCommonTableGen) set(NVPTXCodeGen_sources + NVPTXAllocaHoisting.cpp + NVPTXAsmPrinter.cpp + NVPTXAssignValidGlobalNames.cpp NVPTXFavorNonGenericAddrSpaces.cpp NVPTXFrameLowering.cpp - NVPTXInstrInfo.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 - NVPTXLowerAggrCopies.cpp - NVPTXutil.cpp - NVPTXAllocaHoisting.cpp - NVPTXAsmPrinter.cpp + NVPTXTargetTransformInfo.cpp NVPTXUtilities.cpp + NVPTXutil.cpp NVVMReflect.cpp - NVPTXGenericToNVVM.cpp - NVPTXAssignValidGlobalNames.cpp - NVPTXPrologEpilogPass.cpp - NVPTXMCExpr.cpp - NVPTXReplaceImageHandles.cpp - NVPTXImageOptimizer.cpp - NVPTXLowerStructArgs.cpp ) add_llvm_target(NVPTXCodeGen ${NVPTXCodeGen_sources}) diff --git a/lib/Target/NVPTX/NVPTX.h b/lib/Target/NVPTX/NVPTX.h index 9f315f6dded..13ba57ee21b 100644 --- a/lib/Target/NVPTX/NVPTX.h +++ b/lib/Target/NVPTX/NVPTX.h @@ -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(); diff --git a/lib/Target/NVPTX/NVPTXTargetMachine.cpp b/lib/Target/NVPTX/NVPTXTargetMachine.cpp index 75df2c5bcae..dd7a6818a08 100644 --- a/lib/Target/NVPTX/NVPTXTargetMachine.cpp +++ b/lib/Target/NVPTX/NVPTXTargetMachine.cpp @@ -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). diff --git a/lib/Target/NVPTX/NVPTXTargetMachine.h b/lib/Target/NVPTX/NVPTXTargetMachine.h index 3dca4da724a..9c485b70854 100644 --- a/lib/Target/NVPTX/NVPTXTargetMachine.h +++ b/lib/Target/NVPTX/NVPTXTargetMachine.h @@ -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 { diff --git a/lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp b/lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp new file mode 100644 index 00000000000..b3a5b60c068 --- /dev/null +++ b/lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp @@ -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; } -- 2.34.1