1//===-- PowerPCSubtarget.cpp - PPC Subtarget Information ------------------===// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7//===----------------------------------------------------------------------===// 9// This file implements the PPC specific subclass of TargetSubtargetInfo. 11//===----------------------------------------------------------------------===// 36#define DEBUG_TYPE "ppc-subtarget" 38#define GET_SUBTARGETINFO_TARGET_DESC 39#define GET_SUBTARGETINFO_CTOR 40#include "PPCGenSubtargetInfo.inc" 44cl::desc(
"Enable Machine Pipeliner for PPC"),
50 initializeEnvironment();
51 initSubtargetFeatures(CPU, TuneCPU, FS);
56const std::string &TuneCPU,
const std::string &FS,
59 IsPPC64(TargetTriple.getArch() ==
Triple::ppc64 ||
60 TargetTriple.getArch() ==
Triple::ppc64le),
61 TM(TM), FrameLowering(initializeSubtargetDependencies(CPU, TuneCPU, FS)),
62 InstrInfo(*this), TLInfo(TM, *this) {
63TSInfo = std::make_unique<PPCSelectionDAGInfo>();
79void PPCSubtarget::initializeEnvironment() {
87// Determine default and user specified characteristics 88 std::string CPUName = std::string(CPU);
89if (CPUName.empty() || CPU ==
"generic") {
96// Determine the CPU to schedule for. 97if (TuneCPU.
empty()) TuneCPU = CPUName;
99// Initialize scheduling itinerary for the specified CPU. 102// Parse features string. 105// If the user requested use of 64-bit regs, but the cpu selected doesn't 106// support it, ignore. 107if (
IsPPC64 && has64BitSupport())
115if (HasSPE && (HasAltivec || HasVSX || HasFPU))
117"SPE and traditional floating point cannot both be enabled.\n",
false);
119// If not SPE, set standard FPU 125// Determine endianness. 128if (HasAIXSmallLocalExecTLS || HasAIXSmallLocalDynamicTLS) {
131"only supported on AIX in " 134// The aix-small-local-[exec|dynamic]-tls attribute should only be used with 135// -data-sections, as having data sections turned off with this option 136// is not ideal for performance. Moreover, the 137// small-local-[exec|dynamic]-tls region is a limited resource, and should 138// not be used for variables that may be replaced. 141"only be specified with " 148"is only supported on AIX in 64-bit mode.\n",
160// This overrides the PostRAScheduler bit in the SchedModel for each CPU. 164return TargetSubtargetInfo::ANTIDEP_ALL;
168 CriticalPathRCs.clear();
169 CriticalPathRCs.push_back(
isPPC64() ?
170 &PPC::G8RCRegClass : &PPC::GPRCRegClass);
174unsigned NumRegionInstrs)
const{
175// The GenericScheduler that we use defaults to scheduling bottom up only. 176// We want to schedule from both the top and the bottom and so we set 177// OnlyBottomUp to false. 178// We want to do bi-directional scheduling since it provides a more balanced 179// schedule leading to better performance. 181// Spilling is generally expensive on all PPC cores, so always enable 182// register-pressure tracking. 195// On AIX the only symbols that aren't indirect are toc-data. 196return !GVar->hasAttribute(
"toc-data");
201// Large code model always uses the TOC even for local symbols. 212// If there isn't an attribute to override the module code model 213// this will be the effective code model. 216// Initially support per global code model for AIX only. 220// Only GlobalVariables carry an attribute which can override the module code 222assert(GV &&
"Unexpected NULL GlobalValue");
229constGlobalAlias *Alias = dyn_cast<GlobalAlias>(GV);
239 std::optional<CodeModel::Model> MaybeCodeModel = GlobalVar->getCodeModel();
243"invalid code model for AIX");
static cl::opt< bool > EnableMachinePipeliner("aarch64-enable-pipeliner", cl::desc("Enable Machine Pipeliner for AArch64"), cl::init(false), cl::Hidden)
This file describes how to lower LLVM calls to machine code calls.
This file declares the targeting of the Machinelegalizer class for PowerPC.
This file declares the targeting of the RegisterBankInfo class for PowerPC.
static cl::opt< bool > EnableMachinePipeliner("ppc-enable-pipeliner", cl::desc("Enable Machine Pipeliner for PPC"), cl::init(false), cl::Hidden)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
const GlobalObject * getAliaseeObject() const
This class provides the information for the PowerPC target legalizer for GlobalISel.
std::unique_ptr< InstructionSelector > InstSelector
bool enableMachinePipeliner() const override
Pipeliner customization.
bool useDFAforSMS() const override
Machine Pipeliner customization.
const CallLowering * getCallLowering() const override
Triple TargetTriple
TargetTriple - What processor and OS we're targeting.
const LegalizerInfo * getLegalizerInfo() const override
std::unique_ptr< RegisterBankInfo > RegBankInfo
InstrItineraryData InstrItins
Selected instruction itineraries (one entry per itinerary class.)
Align StackAlignment
stackAlignment - The minimum alignment known to hold of the stack frame on entry to the function and ...
void overrideSchedPolicy(MachineSchedPolicy &Policy, unsigned NumRegionInstrs) const override
bool isPPC64() const
isPPC64 - Return true if we are generating code for 64-bit pointer mode.
void getCriticalPathRCs(RegClassVector &CriticalPathRCs) const override
bool isUsingPCRelativeCalls() const
bool enableSubRegLiveness() const override
const PPCTargetLowering * getTargetLowering() const override
InstructionSelector * getInstructionSelector() const override
unsigned CPUDirective
Which cpu directive was used.
AntiDepBreakMode getAntiDepBreakMode() const override
const SelectionDAGTargetInfo * getSelectionDAGInfo() const override
bool useAA() const override
PPCSubtarget & initializeSubtargetDependencies(StringRef CPU, StringRef TuneCPU, StringRef FS)
initializeSubtargetDependencies - Initializes using a CPU, a TuneCPU, and feature string so that we c...
CodeModel::Model getCodeModel(const TargetMachine &TM, const GlobalValue *GV) const
Calculates the effective code model for argument GV.
Align getPlatformStackAlignment() const
const PPCTargetMachine & getTargetMachine() const
PPCSubtarget(const Triple &TT, const std::string &CPU, const std::string &TuneCPU, const std::string &FS, const PPCTargetMachine &TM)
This constructor initializes the data members to match that of the specified triple.
const PPCTargetMachine & TM
std::unique_ptr< const SelectionDAGTargetInfo > TSInfo
bool enableMachineScheduler() const override
Scheduling customization.
const RegisterBankInfo * getRegBankInfo() const override
const PPCRegisterInfo * getRegisterInfo() const override
bool isGVIndirectSymbol(const GlobalValue *GV) const
True if the GV will be accessed via an indirect symbol.
std::unique_ptr< CallLowering > CallLoweringInfo
GlobalISel related APIs.
bool enablePostRAScheduler() const override
This overrides the PostRAScheduler bit in the SchedModel for each CPU.
void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS)
ParseSubtargetFeatures - Parses features string setting specified subtarget options.
Common code between 32-bit and 64-bit PowerPC targets.
bool isLittleEndian() const
Holds all the information related to register banks.
Targets can subclass this to parameterize the SelectionDAG lowering and instruction selection process...
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
Primary interface to the complete machine description for the target machine.
bool shouldAssumeDSOLocal(const GlobalValue *GV) const
bool getDataSections() const
Return true if data objects should be emitted into their own section, corresponds to -fdata-sections.
CodeModel::Model getCodeModel() const
Returns the code model.
Triple - Helper class for working with autoconf configuration names.
SubArchType getSubArch() const
get the parsed subarchitecture type for this triple.
bool isOSAIX() const
Tests whether the OS is AIX.
bool isPPC32SecurePlt() const
Tests whether the target 32-bit PowerPC uses Secure PLT.
StringRef getNormalizedPPCTargetCPU(const Triple &T, StringRef CPUName="")
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
InstructionSelector * createPPCInstructionSelector(const PPCTargetMachine &TM, const PPCSubtarget &Subtarget, const PPCRegisterBankInfo &RBI)
This struct is a compact representation of a valid (non-zero power of two) alignment.
Define a generic scheduling policy for targets that don't provide their own MachineSchedStrategy.