LLVM 20.0.0git
PPCTargetMachine.cpp
Go to the documentation of this file.
1//===-- PPCTargetMachine.cpp - Define TargetMachine for PowerPC -----------===//
2//
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
6//
7//===----------------------------------------------------------------------===//
8//
9// Top-level implementation for the PowerPC target.
10//
11//===----------------------------------------------------------------------===//
12
13#include "PPCTargetMachine.h"
15#include "PPC.h"
17#include "PPCMachineScheduler.h"
18#include "PPCMacroFusion.h"
19#include "PPCSubtarget.h"
20#include "PPCTargetObjectFile.h"
23#include "llvm/ADT/StringRef.h"
32#include "llvm/CodeGen/Passes.h"
34#include "llvm/IR/Attributes.h"
35#include "llvm/IR/DataLayout.h"
36#include "llvm/IR/Function.h"
39#include "llvm/Pass.h"
46#include <cassert>
47#include <memory>
48#include <optional>
49#include <string>
50
51using namespace llvm;
52
53
54static cl::opt<bool>
55 EnableBranchCoalescing("enable-ppc-branch-coalesce", cl::Hidden,
56 cl::desc("enable coalescing of duplicate branches for PPC"));
57static cl::
58opt<bool> DisableCTRLoops("disable-ppc-ctrloops", cl::Hidden,
59 cl::desc("Disable CTR loops for PPC"));
60
61static cl::
62opt<bool> DisableInstrFormPrep("disable-ppc-instr-form-prep", cl::Hidden,
63 cl::desc("Disable PPC loop instr form prep"));
64
65static cl::opt<bool>
66VSXFMAMutateEarly("schedule-ppc-vsx-fma-mutation-early",
67 cl::Hidden, cl::desc("Schedule VSX FMA instruction mutation early"));
68
69static cl::
70opt<bool> DisableVSXSwapRemoval("disable-ppc-vsx-swap-removal", cl::Hidden,
71 cl::desc("Disable VSX Swap Removal for PPC"));
72
73static cl::
74opt<bool> DisableMIPeephole("disable-ppc-peephole", cl::Hidden,
75 cl::desc("Disable machine peepholes for PPC"));
76
77static cl::opt<bool>
78EnableGEPOpt("ppc-gep-opt", cl::Hidden,
79 cl::desc("Enable optimizations on complex GEPs"),
80 cl::init(true));
81
82static cl::opt<bool>
83EnablePrefetch("enable-ppc-prefetching",
84 cl::desc("enable software prefetching on PPC"),
85 cl::init(false), cl::Hidden);
86
87static cl::opt<bool>
88EnableExtraTOCRegDeps("enable-ppc-extra-toc-reg-deps",
89 cl::desc("Add extra TOC register dependencies"),
90 cl::init(true), cl::Hidden);
91
92static cl::opt<bool>
93EnableMachineCombinerPass("ppc-machine-combiner",
94 cl::desc("Enable the machine combiner pass"),
95 cl::init(true), cl::Hidden);
96
97static cl::opt<bool>
98 ReduceCRLogical("ppc-reduce-cr-logicals",
99 cl::desc("Expand eligible cr-logical binary ops to branches"),
100 cl::init(true), cl::Hidden);
101
103 "enable-ppc-gen-scalar-mass", cl::init(false),
104 cl::desc("Enable lowering math functions to their corresponding MASS "
105 "(scalar) entries"),
106 cl::Hidden);
107
108static cl::opt<bool>
109 EnableGlobalMerge("ppc-global-merge", cl::Hidden, cl::init(false),
110 cl::desc("Enable the global merge pass"));
111
113 GlobalMergeMaxOffset("ppc-global-merge-max-offset", cl::Hidden,
114 cl::init(0x7fff),
115 cl::desc("Maximum global merge offset"));
116
118 // Register the targets
123
125#ifndef NDEBUG
127#endif
147}
148
149static bool isLittleEndianTriple(const Triple &T) {
150 return T.getArch() == Triple::ppc64le || T.getArch() == Triple::ppcle;
151}
152
153/// Return the datalayout string of a subtarget.
154static std::string getDataLayoutString(const Triple &T) {
155 bool is64Bit = T.getArch() == Triple::ppc64 || T.getArch() == Triple::ppc64le;
156 std::string Ret;
157
158 // Most PPC* platforms are big endian, PPC(64)LE is little endian.
160 Ret = "e";
161 else
162 Ret = "E";
163
165
166 // PPC32 has 32 bit pointers. The PS3 (OS Lv2) is a PPC64 machine with 32 bit
167 // pointers.
168 if (!is64Bit || T.getOS() == Triple::Lv2)
169 Ret += "-p:32:32";
170
171 // If the target ABI uses function descriptors, then the alignment of function
172 // pointers depends on the alignment used to emit the descriptor. Otherwise,
173 // function pointers are aligned to 32 bits because the instructions must be.
174 if ((T.getArch() == Triple::ppc64 && !T.isPPC64ELFv2ABI())) {
175 Ret += "-Fi64";
176 } else if (T.isOSAIX()) {
177 Ret += is64Bit ? "-Fi64" : "-Fi32";
178 } else {
179 Ret += "-Fn32";
180 }
181
182 // Note, the alignment values for f64 and i64 on ppc64 in Darwin
183 // documentation are wrong; these are correct (i.e. "what gcc does").
184 Ret += "-i64:64";
185
186 // PPC64 has 32 and 64 bit registers, PPC32 has only 32 bit ones.
187 if (is64Bit)
188 Ret += "-i128:128-n32:64";
189 else
190 Ret += "-n32";
191
192 // Specify the vector alignment explicitly. For v256i1 and v512i1, the
193 // calculated alignment would be 256*alignment(i1) and 512*alignment(i1),
194 // which is 256 and 512 bytes - way over aligned.
195 if (is64Bit && (T.isOSAIX() || T.isOSLinux()))
196 Ret += "-S128-v256:256:256-v512:512:512";
197
198 return Ret;
199}
200
202 const Triple &TT) {
203 std::string FullFS = std::string(FS);
204
205 // Make sure 64-bit features are available when CPUname is generic
206 if (TT.getArch() == Triple::ppc64 || TT.getArch() == Triple::ppc64le) {
207 if (!FullFS.empty())
208 FullFS = "+64bit," + FullFS;
209 else
210 FullFS = "+64bit";
211 }
212
213 if (OL >= CodeGenOptLevel::Default) {
214 if (!FullFS.empty())
215 FullFS = "+crbits," + FullFS;
216 else
217 FullFS = "+crbits";
218 }
219
220 if (OL != CodeGenOptLevel::None) {
221 if (!FullFS.empty())
222 FullFS = "+invariant-function-descriptors," + FullFS;
223 else
224 FullFS = "+invariant-function-descriptors";
225 }
226
227 if (TT.isOSAIX()) {
228 if (!FullFS.empty())
229 FullFS = "+aix," + FullFS;
230 else
231 FullFS = "+aix";
232 }
233
234 return FullFS;
235}
236
237static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) {
238 if (TT.isOSAIX())
239 return std::make_unique<TargetLoweringObjectFileXCOFF>();
240
241 return std::make_unique<PPC64LinuxTargetObjectFile>();
242}
243
245 const TargetOptions &Options) {
246 if (Options.MCOptions.getABIName().starts_with("elfv1"))
248 else if (Options.MCOptions.getABIName().starts_with("elfv2"))
250
251 assert(Options.MCOptions.getABIName().empty() &&
252 "Unknown target-abi option!");
253
254 switch (TT.getArch()) {
255 case Triple::ppc64le:
257 case Triple::ppc64:
258 if (TT.isPPC64ELFv2ABI())
260 else
262 default:
264 }
265}
266
268 std::optional<Reloc::Model> RM) {
269 if (TT.isOSAIX() && RM && *RM != Reloc::PIC_)
270 report_fatal_error("invalid relocation model, AIX only supports PIC",
271 false);
272
273 if (RM)
274 return *RM;
275
276 // Big Endian PPC and AIX default to PIC.
277 if (TT.getArch() == Triple::ppc64 || TT.isOSAIX())
278 return Reloc::PIC_;
279
280 // Rest are static by default.
281 return Reloc::Static;
282}
283
284static CodeModel::Model
285getEffectivePPCCodeModel(const Triple &TT, std::optional<CodeModel::Model> CM,
286 bool JIT) {
287 if (CM) {
288 if (*CM == CodeModel::Tiny)
289 report_fatal_error("Target does not support the tiny CodeModel", false);
290 if (*CM == CodeModel::Kernel)
291 report_fatal_error("Target does not support the kernel CodeModel", false);
292 return *CM;
293 }
294
295 if (JIT)
296 return CodeModel::Small;
297 if (TT.isOSAIX())
298 return CodeModel::Small;
299
300 assert(TT.isOSBinFormatELF() && "All remaining PPC OSes are ELF based.");
301
302 if (TT.isArch32Bit())
303 return CodeModel::Small;
304
305 assert(TT.isArch64Bit() && "Unsupported PPC architecture.");
306 return CodeModel::Medium;
307}
308
309
311 const PPCSubtarget &ST = C->MF->getSubtarget<PPCSubtarget>();
312 ScheduleDAGMILive *DAG =
313 new ScheduleDAGMILive(C, ST.usePPCPreRASchedStrategy() ?
314 std::make_unique<PPCPreRASchedStrategy>(C) :
315 std::make_unique<GenericScheduler>(C));
316 // add DAG Mutations here.
317 DAG->addMutation(createCopyConstrainDAGMutation(DAG->TII, DAG->TRI));
318 if (ST.hasStoreFusion())
319 DAG->addMutation(createStoreClusterDAGMutation(DAG->TII, DAG->TRI));
320 if (ST.hasFusion())
321 DAG->addMutation(createPowerPCMacroFusionDAGMutation());
322
323 return DAG;
324}
325
328 const PPCSubtarget &ST = C->MF->getSubtarget<PPCSubtarget>();
329 ScheduleDAGMI *DAG =
330 new ScheduleDAGMI(C, ST.usePPCPostRASchedStrategy() ?
331 std::make_unique<PPCPostRASchedStrategy>(C) :
332 std::make_unique<PostGenericScheduler>(C), true);
333 // add DAG Mutations here.
334 if (ST.hasStoreFusion())
335 DAG->addMutation(createStoreClusterDAGMutation(DAG->TII, DAG->TRI));
336 if (ST.hasFusion())
337 DAG->addMutation(createPowerPCMacroFusionDAGMutation());
338 return DAG;
339}
340
341// The FeatureString here is a little subtle. We are modifying the feature
342// string with what are (currently) non-function specific overrides as it goes
343// into the CodeGenTargetMachineImpl constructor and then using the stored value
344// in the Subtarget constructor below it.
346 StringRef CPU, StringRef FS,
347 const TargetOptions &Options,
348 std::optional<Reloc::Model> RM,
349 std::optional<CodeModel::Model> CM,
350 CodeGenOptLevel OL, bool JIT)
352 computeFSAdditions(FS, OL, TT), Options,
354 getEffectivePPCCodeModel(TT, CM, JIT), OL),
355 TLOF(createTLOF(getTargetTriple())),
356 TargetABI(computeTargetABI(TT, Options)),
357 Endianness(isLittleEndianTriple(TT) ? Endian::LITTLE : Endian::BIG) {
358 initAsmInfo();
359}
360
362
363const PPCSubtarget *
365 Attribute CPUAttr = F.getFnAttribute("target-cpu");
366 Attribute TuneAttr = F.getFnAttribute("tune-cpu");
367 Attribute FSAttr = F.getFnAttribute("target-features");
368
369 std::string CPU =
370 CPUAttr.isValid() ? CPUAttr.getValueAsString().str() : TargetCPU;
371 std::string TuneCPU =
372 TuneAttr.isValid() ? TuneAttr.getValueAsString().str() : CPU;
373 std::string FS =
374 FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
375
376 // FIXME: This is related to the code below to reset the target options,
377 // we need to know whether or not the soft float flag is set on the
378 // function before we can generate a subtarget. We also need to use
379 // it as a key for the subtarget since that can be the only difference
380 // between two functions.
381 bool SoftFloat = F.getFnAttribute("use-soft-float").getValueAsBool();
382 // If the soft float attribute is set on the function turn on the soft float
383 // subtarget feature.
384 if (SoftFloat)
385 FS += FS.empty() ? "-hard-float" : ",-hard-float";
386
387 auto &I = SubtargetMap[CPU + TuneCPU + FS];
388 if (!I) {
389 // This needs to be done before we create a new subtarget since any
390 // creation will depend on the TM and the code generation flags on the
391 // function that reside in TargetOptions.
393 I = std::make_unique<PPCSubtarget>(
394 TargetTriple, CPU, TuneCPU,
395 // FIXME: It would be good to have the subtarget additions here
396 // not necessary. Anything that turns them on/off (overrides) ends
397 // up being put at the end of the feature string, but the defaults
398 // shouldn't require adding them. Fixing this means pulling Feature64Bit
399 // out of most of the target cpus in the .td file and making it set only
400 // as part of initialization via the TargetTriple.
402 }
403 return I.get();
404}
405
406//===----------------------------------------------------------------------===//
407// Pass Pipeline Configuration
408//===----------------------------------------------------------------------===//
409
410namespace {
411
412/// PPC Code Generator Pass Configuration Options.
413class PPCPassConfig : public TargetPassConfig {
414public:
415 PPCPassConfig(PPCTargetMachine &TM, PassManagerBase &PM)
416 : TargetPassConfig(TM, PM) {
417 // At any optimization level above -O0 we use the Machine Scheduler and not
418 // the default Post RA List Scheduler.
419 if (TM.getOptLevel() != CodeGenOptLevel::None)
420 substitutePass(&PostRASchedulerID, &PostMachineSchedulerID);
421 }
422
423 PPCTargetMachine &getPPCTargetMachine() const {
424 return getTM<PPCTargetMachine>();
425 }
426
427 void addIRPasses() override;
428 bool addPreISel() override;
429 bool addILPOpts() override;
430 bool addInstSelector() override;
431 void addMachineSSAOptimization() override;
432 void addPreRegAlloc() override;
433 void addPreSched2() override;
434 void addPreEmitPass() override;
435 void addPreEmitPass2() override;
436 // GlobalISEL
437 bool addIRTranslator() override;
438 bool addLegalizeMachineIR() override;
439 bool addRegBankSelect() override;
440 bool addGlobalInstructionSelect() override;
441
443 createMachineScheduler(MachineSchedContext *C) const override {
445 }
447 createPostMachineScheduler(MachineSchedContext *C) const override {
449 }
450};
451
452} // end anonymous namespace
453
455 return new PPCPassConfig(*this, PM);
456}
457
458void PPCPassConfig::addIRPasses() {
459 if (TM->getOptLevel() != CodeGenOptLevel::None)
460 addPass(createPPCBoolRetToIntPass());
462
463 // Lower generic MASSV routines to PowerPC subtarget-specific entries.
465
466 // Generate PowerPC target-specific entries for scalar math functions
467 // that are available in IBM MASS (scalar) library.
468 if (TM->getOptLevel() == CodeGenOptLevel::Aggressive &&
470 TM->Options.PPCGenScalarMASSEntries = EnablePPCGenScalarMASSEntries;
472 }
473
474 // If explicitly requested, add explicit data prefetch intrinsics.
475 if (EnablePrefetch.getNumOccurrences() > 0)
477
478 if (TM->getOptLevel() >= CodeGenOptLevel::Default && EnableGEPOpt) {
479 // Call SeparateConstOffsetFromGEP pass to extract constants within indices
480 // and lower a GEP with multiple indices to either arithmetic operations or
481 // multiple GEPs with single index.
483 // Call EarlyCSE pass to find and remove subexpressions in the lowered
484 // result.
485 addPass(createEarlyCSEPass());
486 // Do loop invariant code motion in case part of the lowered result is
487 // invariant.
488 addPass(createLICMPass());
489 }
490
492}
493
494bool PPCPassConfig::addPreISel() {
495 // The GlobalMerge pass is intended to be on by default on AIX.
496 // Specifying the command line option overrides the AIX default.
497 if ((EnableGlobalMerge.getNumOccurrences() > 0)
499 : getOptLevel() != CodeGenOptLevel::None)
500 addPass(createGlobalMergePass(TM, GlobalMergeMaxOffset, false, false, true,
501 true));
502
503 if (!DisableInstrFormPrep && getOptLevel() != CodeGenOptLevel::None)
504 addPass(createPPCLoopInstrFormPrepPass(getPPCTargetMachine()));
505
506 if (!DisableCTRLoops && getOptLevel() != CodeGenOptLevel::None)
508
509 return false;
510}
511
512bool PPCPassConfig::addILPOpts() {
513 addPass(&EarlyIfConverterLegacyID);
514
516 addPass(&MachineCombinerID);
517
518 return true;
519}
520
521bool PPCPassConfig::addInstSelector() {
522 // Install an instruction selector.
523 addPass(createPPCISelDag(getPPCTargetMachine(), getOptLevel()));
524
525#ifndef NDEBUG
526 if (!DisableCTRLoops && getOptLevel() != CodeGenOptLevel::None)
527 addPass(createPPCCTRLoopsVerify());
528#endif
529
530 addPass(createPPCVSXCopyPass());
531 return false;
532}
533
534void PPCPassConfig::addMachineSSAOptimization() {
535 // Run CTR loops pass before any cfg modification pass to prevent the
536 // canonical form of hardware loop from being destroied.
537 if (!DisableCTRLoops && getOptLevel() != CodeGenOptLevel::None)
538 addPass(createPPCCTRLoopsPass());
539
540 // PPCBranchCoalescingPass need to be done before machine sinking
541 // since it merges empty blocks.
542 if (EnableBranchCoalescing && getOptLevel() != CodeGenOptLevel::None)
545 // For little endian, remove where possible the vector swap instructions
546 // introduced at code generation to normalize vector element order.
547 if (TM->getTargetTriple().getArch() == Triple::ppc64le &&
550 // Reduce the number of cr-logical ops.
551 if (ReduceCRLogical && getOptLevel() != CodeGenOptLevel::None)
553 // Target-specific peephole cleanups performed after instruction
554 // selection.
555 if (!DisableMIPeephole) {
556 addPass(createPPCMIPeepholePass());
558 }
559}
560
561void PPCPassConfig::addPreRegAlloc() {
562 if (getOptLevel() != CodeGenOptLevel::None) {
566 }
567
568 // FIXME: We probably don't need to run these for -fPIE.
569 if (getPPCTargetMachine().isPositionIndependent()) {
570 // FIXME: LiveVariables should not be necessary here!
571 // PPCTLSDynamicCallPass uses LiveIntervals which previously dependent on
572 // LiveVariables. This (unnecessary) dependency has been removed now,
573 // however a stage-2 clang build fails without LiveVariables computed here.
574 addPass(&LiveVariablesID);
576 }
578 addPass(createPPCTOCRegDepsPass());
579
580 if (getOptLevel() != CodeGenOptLevel::None)
581 addPass(&MachinePipelinerID);
582}
583
584void PPCPassConfig::addPreSched2() {
585 if (getOptLevel() != CodeGenOptLevel::None)
586 addPass(&IfConverterID);
587}
588
589void PPCPassConfig::addPreEmitPass() {
591
592 if (getOptLevel() != CodeGenOptLevel::None)
593 addPass(createPPCEarlyReturnPass());
594}
595
596void PPCPassConfig::addPreEmitPass2() {
597 // Schedule the expansion of AMOs at the last possible moment, avoiding the
598 // possibility for other passes to break the requirements for forward
599 // progress in the LL/SC block.
601 // Must run branch selection immediately preceding the asm printer.
603}
604
607 return TargetTransformInfo(PPCTTIImpl(this, F));
608}
609
611 assert(Endianness != Endian::NOT_DETECTED &&
612 "Unable to determine endianness");
613 return Endianness == Endian::LITTLE;
614}
615
617 BumpPtrAllocator &Allocator, const Function &F,
618 const TargetSubtargetInfo *STI) const {
619 return PPCFunctionInfo::create<PPCFunctionInfo>(Allocator, F, STI);
620}
621
624 "Run PowerPC PreRA specific scheduler",
626
629 "Run PowerPC PostRA specific scheduler",
631
632// Global ISEL
633bool PPCPassConfig::addIRTranslator() {
634 addPass(new IRTranslator());
635 return false;
636}
637
638bool PPCPassConfig::addLegalizeMachineIR() {
639 addPass(new Legalizer());
640 return false;
641}
642
643bool PPCPassConfig::addRegBankSelect() {
644 addPass(new RegBankSelect());
645 return false;
646}
647
648bool PPCPassConfig::addGlobalInstructionSelect() {
649 addPass(new InstructionSelect(getOptLevel()));
650 return false;
651}
static cl::opt< bool > EnableGEPOpt("aarch64-enable-gep-opt", cl::Hidden, cl::desc("Enable optimizations on complex GEPs"), cl::init(false))
This file contains the simple types necessary to represent the attributes associated with functions a...
static cl::opt< bool > DisableMIPeephole("disable-bpf-peephole", cl::Hidden, cl::desc("Disable machine peepholes for BPF"))
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
#define LLVM_EXTERNAL_VISIBILITY
Definition: Compiler.h:128
static cl::opt< unsigned > GlobalMergeMaxOffset("global-merge-max-offset", cl::Hidden, cl::desc("Set maximum offset for global merge pass"), cl::init(0))
static cl::opt< bool > EnableGlobalMerge("enable-global-merge", cl::Hidden, cl::desc("Enable the global merge pass"), cl::init(true))
This file declares the IRTranslator pass.
static LVOptions Options
Definition: LVOptions.cpp:25
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
static cl::opt< bool > VSXFMAMutateEarly("schedule-ppc-vsx-fma-mutation-early", cl::Hidden, cl::desc("Schedule VSX FMA instruction mutation early"))
static cl::opt< bool > EnableMachineCombinerPass("ppc-machine-combiner", cl::desc("Enable the machine combiner pass"), cl::init(true), cl::Hidden)
static bool isLittleEndianTriple(const Triple &T)
static MachineSchedRegistry PPCPostRASchedRegistry("ppc-postra", "Run PowerPC PostRA specific scheduler", createPPCPostMachineScheduler)
static cl::opt< bool > DisableCTRLoops("disable-ppc-ctrloops", cl::Hidden, cl::desc("Disable CTR loops for PPC"))
static cl::opt< bool > DisableMIPeephole("disable-ppc-peephole", cl::Hidden, cl::desc("Disable machine peepholes for PPC"))
static cl::opt< bool > EnableExtraTOCRegDeps("enable-ppc-extra-toc-reg-deps", cl::desc("Add extra TOC register dependencies"), cl::init(true), cl::Hidden)
static PPCTargetMachine::PPCABI computeTargetABI(const Triple &TT, const TargetOptions &Options)
static cl::opt< bool > EnablePrefetch("enable-ppc-prefetching", cl::desc("enable software prefetching on PPC"), cl::init(false), cl::Hidden)
static cl::opt< bool > EnablePPCGenScalarMASSEntries("enable-ppc-gen-scalar-mass", cl::init(false), cl::desc("Enable lowering math functions to their corresponding MASS " "(scalar) entries"), cl::Hidden)
static cl::opt< bool > ReduceCRLogical("ppc-reduce-cr-logicals", cl::desc("Expand eligible cr-logical binary ops to branches"), cl::init(true), cl::Hidden)
static cl::opt< bool > EnableGEPOpt("ppc-gep-opt", cl::Hidden, cl::desc("Enable optimizations on complex GEPs"), cl::init(true))
static ScheduleDAGInstrs * createPPCPostMachineScheduler(MachineSchedContext *C)
static CodeModel::Model getEffectivePPCCodeModel(const Triple &TT, std::optional< CodeModel::Model > CM, bool JIT)
static std::string getDataLayoutString(const Triple &T)
Return the datalayout string of a subtarget.
static cl::opt< bool > DisableInstrFormPrep("disable-ppc-instr-form-prep", cl::Hidden, cl::desc("Disable PPC loop instr form prep"))
static std::string computeFSAdditions(StringRef FS, CodeGenOptLevel OL, const Triple &TT)
static MachineSchedRegistry PPCPreRASchedRegistry("ppc-prera", "Run PowerPC PreRA specific scheduler", createPPCMachineScheduler)
static cl::opt< unsigned > GlobalMergeMaxOffset("ppc-global-merge-max-offset", cl::Hidden, cl::init(0x7fff), cl::desc("Maximum global merge offset"))
static cl::opt< bool > DisableVSXSwapRemoval("disable-ppc-vsx-swap-removal", cl::Hidden, cl::desc("Disable VSX Swap Removal for PPC"))
static Reloc::Model getEffectiveRelocModel(const Triple &TT, std::optional< Reloc::Model > RM)
static cl::opt< bool > EnableBranchCoalescing("enable-ppc-branch-coalesce", cl::Hidden, cl::desc("enable coalescing of duplicate branches for PPC"))
static ScheduleDAGInstrs * createPPCMachineScheduler(MachineSchedContext *C)
static cl::opt< bool > EnableGlobalMerge("ppc-global-merge", cl::Hidden, cl::init(false), cl::desc("Enable the global merge pass"))
LLVM_EXTERNAL_VISIBILITY void LLVMInitializePowerPCTarget()
This file a TargetTransformInfo::Concept conforming object specific to the PPC target machine.
Basic Register Allocator
This file describes the interface of the MachineFunctionPass responsible for assigning the generic vi...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
Target-Independent Code Generator Pass Configuration Options pass.
This pass exposes codegen information to IR-level passes.
static std::unique_ptr< TargetLoweringObjectFile > createTLOF()
static bool is64Bit(const char *name)
StringRef getValueAsString() const
Return the attribute's value as a string.
Definition: Attributes.cpp:392
bool isValid() const
Return true if the attribute is any kind of attribute.
Definition: Attributes.h:208
Allocate memory in an ever growing pool, as if by bump-pointer.
Definition: Allocator.h:66
implements a set of functionality in the TargetMachine class for targets that make use of the indepen...
static const char * getManglingComponent(const Triple &T)
Definition: DataLayout.cpp:176
This pass is responsible for selecting generic machine instructions to target-specific instructions.
MachineSchedRegistry provides a selection of available machine instruction schedulers.
Common code between 32-bit and 64-bit PowerPC targets.
const PPCSubtarget * getSubtargetImpl() const =delete
~PPCTargetMachine() override
PPCTargetMachine(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, std::optional< Reloc::Model > RM, std::optional< CodeModel::Model > CM, CodeGenOptLevel OL, bool JIT)
TargetTransformInfo getTargetTransformInfo(const Function &F) const override
Get a TargetTransformInfo implementation for the target.
TargetPassConfig * createPassConfig(PassManagerBase &PM) override
Create a pass configuration object to be used by addPassToEmitX methods for generating a pipeline of ...
MachineFunctionInfo * createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F, const TargetSubtargetInfo *STI) const override
Create the target's instance of MachineFunctionInfo.
PassRegistry - This class manages the registration and intitialization of the pass subsystem as appli...
Definition: PassRegistry.h:37
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
This pass implements the reg bank selector pass used in the GlobalISel pipeline.
Definition: RegBankSelect.h:91
A ScheduleDAG for scheduling lists of MachineInstr.
ScheduleDAGMILive is an implementation of ScheduleDAGInstrs that schedules machine instructions while...
ScheduleDAGMI is an implementation of ScheduleDAGInstrs that simply schedules machine instructions ac...
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
std::string str() const
str - Get the contents as an std::string.
Definition: StringRef.h:229
CodeGenOptLevel getOptLevel() const
Returns the optimization level: None, Less, Default, or Aggressive.
Triple TargetTriple
Triple string, CPU name, and target feature strings the TargetMachine instance is created with.
Definition: TargetMachine.h:96
const Triple & getTargetTriple() const
std::string TargetFS
Definition: TargetMachine.h:98
std::string TargetCPU
Definition: TargetMachine.h:97
std::unique_ptr< const MCSubtargetInfo > STI
void resetTargetOptions(const Function &F) const
Reset the target options based on the function's attributes.
Target-Independent Code Generator Pass Configuration Options.
virtual void addIRPasses()
Add common target configurable passes that perform LLVM IR to IR transforms following machine indepen...
virtual void addMachineSSAOptimization()
addMachineSSAOptimization - Add standard passes that optimize machine instructions in SSA form.
TargetSubtargetInfo - Generic base class for all target subtargets.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
PassManagerBase - An abstract interface to allow code to add passes to a pass manager without having ...
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:443
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
FunctionPass * createPPCPreEmitPeepholePass()
Target & getThePPC64LETarget()
void initializePPCTLSDynamicCallPass(PassRegistry &)
char & RegisterCoalescerID
RegisterCoalescer - This pass merges live ranges to eliminate copies.
FunctionPass * createPPCLoopInstrFormPrepPass(PPCTargetMachine &TM)
void initializePPCVSXFMAMutatePass(PassRegistry &)
void initializePPCLowerMASSVEntriesPass(PassRegistry &)
Pass * createGlobalMergePass(const TargetMachine *TM, unsigned MaximalOffset, bool OnlyOptimizeForSize=false, bool MergeExternalByDefault=false, bool MergeConstantByDefault=false, bool MergeConstAggressiveByDefault=false)
GlobalMerge - This pass merges internal (by default) globals into structs to enable reuse of a base p...
char & PostRASchedulerID
PostRAScheduler - This pass performs post register allocation scheduling.
Target & getThePPC32Target()
FunctionPass * createPPCCTRLoopsPass()
Definition: PPCCTRLoops.cpp:91
char & MachineSchedulerID
MachineScheduler - This pass schedules machine instructions.
FunctionPass * createPPCTLSDynamicCallPass()
char & PostMachineSchedulerID
PostMachineScheduler - This pass schedules machine instructions postRA.
Pass * createLICMPass()
Definition: LICM.cpp:381
FunctionPass * createPPCEarlyReturnPass()
void initializePPCPreEmitPeepholePass(PassRegistry &)
char & EarlyIfConverterLegacyID
EarlyIfConverter - This pass performs if-conversion on SSA form by inserting cmov instructions.
FunctionPass * createPPCExpandAtomicPseudoPass()
void initializePPCTOCRegDepsPass(PassRegistry &)
void initializePPCReduceCRLogicalsPass(PassRegistry &)
char & MachineCombinerID
This pass performs instruction combining using trace metrics to estimate critical-path and resource d...
void initializePPCVSXCopyPass(PassRegistry &)
FunctionPass * createPPCVSXCopyPass()
void initializePPCCTRLoopsVerifyPass(PassRegistry &)
FunctionPass * createPPCVSXSwapRemovalPass()
void initializePPCCTRLoopsPass(PassRegistry &)
ModulePass * createPPCLowerMASSVEntriesPass()
std::unique_ptr< ScheduleDAGMutation > createStoreClusterDAGMutation(const TargetInstrInfo *TII, const TargetRegisterInfo *TRI, bool ReorderWhileClustering=false)
If ReorderWhileClustering is set to true, no attempt will be made to reduce reordering due to store c...
FunctionPass * createLoopDataPrefetchPass()
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:167
void initializePPCDAGToDAGISelLegacyPass(PassRegistry &)
ModulePass * createPPCGenScalarMASSEntriesPass()
void initializePPCEarlyReturnPass(PassRegistry &)
CodeGenOptLevel
Code generation optimization level.
Definition: CodeGen.h:54
void initializePPCGenScalarMASSEntriesPass(PassRegistry &)
FunctionPass * createPPCReduceCRLogicalsPass()
FunctionPass * createPPCISelDag(PPCTargetMachine &TM, CodeGenOptLevel OL)
createPPCISelDag - This pass converts a legalized DAG into a PowerPC-specific DAG,...
void initializePPCExpandAtomicPseudoPass(PassRegistry &)
FunctionPass * createSeparateConstOffsetFromGEPPass(bool LowerGEP=false)
FunctionPass * createPPCBranchCoalescingPass()
createPPCBranchCoalescingPass - returns an instance of the Branch Coalescing Pass
Target & getThePPC64Target()
void initializeGlobalISel(PassRegistry &)
Initialize all passes linked into the GlobalISel library.
Definition: GlobalISel.cpp:17
void initializePPCBSelPass(PassRegistry &)
char & MachinePipelinerID
This pass performs software pipelining on machine instructions.
FunctionPass * createPPCTOCRegDepsPass()
FunctionPass * createPPCCTRLoopsVerify()
void initializePPCBranchCoalescingPass(PassRegistry &)
void initializePPCBoolRetToIntPass(PassRegistry &)
void initializePPCMIPeepholePass(PassRegistry &)
std::unique_ptr< ScheduleDAGMutation > createPowerPCMacroFusionDAGMutation()
Note that you have to add: DAG.addMutation(createPowerPCMacroFusionDAGMutation()); to PPCPassConfig::...
void initializePPCVSXSwapRemovalPass(PassRegistry &)
char & LiveVariablesID
LiveVariables pass - This pass computes the set of blocks in which each variable is life and sets mac...
Target & getThePPC32LETarget()
char & PPCVSXFMAMutateID
char & IfConverterID
IfConverter - This pass performs machine code if conversion.
void initializePPCLoopInstrFormPrepPass(PassRegistry &)
FunctionPass * createAtomicExpandLegacyPass()
AtomicExpandPass - At IR level this pass replace atomic instructions with __atomic_* library calls,...
FunctionPass * createEarlyCSEPass(bool UseMemorySSA=false)
Definition: EarlyCSE.cpp:1944
std::unique_ptr< ScheduleDAGMutation > createCopyConstrainDAGMutation(const TargetInstrInfo *TII, const TargetRegisterInfo *TRI)
FunctionPass * createPPCBranchSelectionPass()
FunctionPass * createPPCBoolRetToIntPass()
char & DeadMachineInstructionElimID
DeadMachineInstructionElim - This pass removes dead machine instructions.
FunctionPass * createHardwareLoopsLegacyPass()
Create Hardware Loop pass.
FunctionPass * createPPCMIPeepholePass()
MachineFunctionInfo - This class can be derived from and used by targets to hold private target-speci...
MachineSchedContext provides enough context from the MachineScheduler pass for the target to instanti...
RegisterTargetMachine - Helper template for registering a target machine implementation,...