#include "PPCTargetMachine.h"
#include "MCTargetDesc/PPCMCTargetDesc.h"
#include "PPC.h"
#include "PPCMachineFunctionInfo.h"
#include "PPCMachineScheduler.h"
#include "PPCMacroFusion.h"
#include "PPCSubtarget.h"
#include "PPCTargetObjectFile.h"
#include "PPCTargetTransformInfo.h"
#include "TargetInfo/PowerPCTargetInfo.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/CodeGen/GlobalISel/IRTranslator.h"
#include "llvm/CodeGen/GlobalISel/InstructionSelect.h"
#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
#include "llvm/CodeGen/GlobalISel/Legalizer.h"
#include "llvm/CodeGen/GlobalISel/Localizer.h"
#include "llvm/CodeGen/GlobalISel/RegBankSelect.h"
#include "llvm/CodeGen/MachineScheduler.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/CodeGen/TargetPassConfig.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/Function.h"
#include "llvm/InitializePasses.h"
#include "llvm/MC/TargetRegistry.h"
#include "llvm/Pass.h"
#include "llvm/Support/CodeGen.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Target/TargetLoweringObjectFile.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/TargetParser/Triple.h"
#include "llvm/Transforms/Scalar.h"
#include <cassert>
#include <memory>
#include <optional>
#include <string>
usingnamespacellvm;
static cl::opt<bool>
EnableBranchCoalescing("enable-ppc-branch-coalesce", cl::Hidden,
cl::desc("enable coalescing of duplicate branches for PPC"));
static cl::
opt<bool> DisableCTRLoops("disable-ppc-ctrloops", cl::Hidden,
cl::desc("Disable CTR loops for PPC"));
static cl::
opt<bool> DisableInstrFormPrep("disable-ppc-instr-form-prep", cl::Hidden,
cl::desc("Disable PPC loop instr form prep"));
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> DisableVSXSwapRemoval("disable-ppc-vsx-swap-removal", cl::Hidden,
cl::desc("Disable VSX Swap Removal for PPC"));
static cl::
opt<bool> DisableMIPeephole("disable-ppc-peephole", cl::Hidden,
cl::desc("Disable machine peepholes for PPC"));
static cl::opt<bool>
EnableGEPOpt("ppc-gep-opt", cl::Hidden,
cl::desc("Enable optimizations on complex GEPs"),
cl::init(true));
static cl::opt<bool>
EnablePrefetch("enable-ppc-prefetching",
cl::desc("enable software prefetching on PPC"),
cl::init(false), cl::Hidden);
static cl::opt<bool>
EnableExtraTOCRegDeps("enable-ppc-extra-toc-reg-deps",
cl::desc("Add extra TOC register dependencies"),
cl::init(true), cl::Hidden);
static cl::opt<bool>
EnableMachineCombinerPass("ppc-machine-combiner",
cl::desc("Enable the machine combiner pass"),
cl::init(true), 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> MergeStringPool(
"ppc-merge-string-pool",
cl::desc("Merge all of the strings in a module into one pool"),
cl::init(true), 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>
EnableGlobalMerge("ppc-global-merge", cl::Hidden, cl::init(false),
cl::desc("Enable the global merge pass"));
static cl::opt<unsigned>
GlobalMergeMaxOffset("ppc-global-merge-max-offset", cl::Hidden,
cl::init(0x7fff),
cl::desc("Maximum global merge offset"));
extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializePowerPCTarget() { … }
static bool isLittleEndianTriple(const Triple &T) { … }
static std::string getDataLayoutString(const Triple &T) { … }
static std::string computeFSAdditions(StringRef FS, CodeGenOptLevel OL,
const Triple &TT) { … }
static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) { … }
static PPCTargetMachine::PPCABI computeTargetABI(const Triple &TT,
const TargetOptions &Options) { … }
static Reloc::Model getEffectiveRelocModel(const Triple &TT,
std::optional<Reloc::Model> RM) { … }
static CodeModel::Model
getEffectivePPCCodeModel(const Triple &TT, std::optional<CodeModel::Model> CM,
bool JIT) { … }
static ScheduleDAGInstrs *createPPCMachineScheduler(MachineSchedContext *C) { … }
static ScheduleDAGInstrs *createPPCPostMachineScheduler(
MachineSchedContext *C) { … }
PPCTargetMachine::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)
: … { … }
PPCTargetMachine::~PPCTargetMachine() = default;
const PPCSubtarget *
PPCTargetMachine::getSubtargetImpl(const Function &F) const { … }
namespace {
class PPCPassConfig : public TargetPassConfig { … };
}
TargetPassConfig *PPCTargetMachine::createPassConfig(PassManagerBase &PM) { … }
void PPCPassConfig::addIRPasses() { … }
bool PPCPassConfig::addPreISel() { … }
bool PPCPassConfig::addILPOpts() { … }
bool PPCPassConfig::addInstSelector() { … }
void PPCPassConfig::addMachineSSAOptimization() { … }
void PPCPassConfig::addPreRegAlloc() { … }
void PPCPassConfig::addPreSched2() { … }
void PPCPassConfig::addPreEmitPass() { … }
void PPCPassConfig::addPreEmitPass2() { … }
TargetTransformInfo
PPCTargetMachine::getTargetTransformInfo(const Function &F) const { … }
bool PPCTargetMachine::isLittleEndian() const { … }
MachineFunctionInfo *PPCTargetMachine::createMachineFunctionInfo(
BumpPtrAllocator &Allocator, const Function &F,
const TargetSubtargetInfo *STI) const { … }
static MachineSchedRegistry
PPCPreRASchedRegistry("ppc-prera",
"Run PowerPC PreRA specific scheduler",
createPPCMachineScheduler);
static MachineSchedRegistry
PPCPostRASchedRegistry("ppc-postra",
"Run PowerPC PostRA specific scheduler",
createPPCPostMachineScheduler);
bool PPCPassConfig::addIRTranslator() { … }
bool PPCPassConfig::addLegalizeMachineIR() { … }
bool PPCPassConfig::addRegBankSelect() { … }
bool PPCPassConfig::addGlobalInstructionSelect() { … }