diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2019-08-21 18:13:02 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2019-08-21 18:13:02 +0000 | 
| commit | 54db30ce18663e6c2991958f3b5d18362e8e93c4 (patch) | |
| tree | 4aa6442802570767398cc83ba484e97b1309bdc2 /contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp | |
| parent | 35284c22e9c8348159b7ce032ea45f2cdeb65298 (diff) | |
| parent | e6d1592492a3a379186bfb02bd0f4eda0669c0d5 (diff) | |
Notes
Diffstat (limited to 'contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp')
| -rw-r--r-- | contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp | 74 | 
1 files changed, 67 insertions, 7 deletions
diff --git a/contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp b/contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp index 580d057602f5..ce00f848dd72 100644 --- a/contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp +++ b/contrib/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp @@ -1,9 +1,8 @@  //===-- PPCTargetMachine.cpp - Define TargetMachine for PowerPC -----------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception  //  //===----------------------------------------------------------------------===//  // @@ -14,9 +13,11 @@  #include "PPCTargetMachine.h"  #include "MCTargetDesc/PPCMCTargetDesc.h"  #include "PPC.h" +#include "PPCMachineScheduler.h"  #include "PPCSubtarget.h"  #include "PPCTargetObjectFile.h"  #include "PPCTargetTransformInfo.h" +#include "TargetInfo/PowerPCTargetInfo.h"  #include "llvm/ADT/Optional.h"  #include "llvm/ADT/STLExtras.h"  #include "llvm/ADT/StringRef.h" @@ -100,6 +101,19 @@ extern "C" void LLVMInitializePowerPCTarget() {    RegisterTargetMachine<PPCTargetMachine> C(getThePPC64LETarget());    PassRegistry &PR = *PassRegistry::getPassRegistry(); +#ifndef NDEBUG +  initializePPCCTRLoopsVerifyPass(PR); +#endif +  initializePPCLoopPreIncPrepPass(PR); +  initializePPCTOCRegDepsPass(PR); +  initializePPCEarlyReturnPass(PR); +  initializePPCVSXCopyPass(PR); +  initializePPCVSXFMAMutatePass(PR); +  initializePPCVSXSwapRemovalPass(PR); +  initializePPCReduceCRLogicalsPass(PR); +  initializePPCBSelPass(PR); +  initializePPCBranchCoalescingPass(PR); +  initializePPCQPXLoadSplatPass(PR);    initializePPCBoolRetToIntPass(PR);    initializePPCExpandISELPass(PR);    initializePPCPreEmitPeepholePass(PR); @@ -199,6 +213,8 @@ static PPCTargetMachine::PPCABI computeTargetABI(const Triple &TT,    case Triple::ppc64le:      return PPCTargetMachine::PPC_ABI_ELFv2;    case Triple::ppc64: +    if (TT.getEnvironment() == llvm::Triple::ELFv2) +      return PPCTargetMachine::PPC_ABI_ELFv2;      return PPCTargetMachine::PPC_ABI_ELFv1;    default:      return PPCTargetMachine::PPC_ABI_UNKNOWN; @@ -227,9 +243,9 @@ static CodeModel::Model getEffectivePPCCodeModel(const Triple &TT,                                                   bool JIT) {    if (CM) {      if (*CM == CodeModel::Tiny) -      report_fatal_error("Target does not support the tiny CodeModel"); +      report_fatal_error("Target does not support the tiny CodeModel", false);      if (*CM == CodeModel::Kernel) -      report_fatal_error("Target does not support the kernel CodeModel"); +      report_fatal_error("Target does not support the kernel CodeModel", false);      return *CM;    }    if (!TT.isOSDarwin() && !JIT && @@ -238,6 +254,29 @@ static CodeModel::Model getEffectivePPCCodeModel(const Triple &TT,    return CodeModel::Small;  } + +static ScheduleDAGInstrs *createPPCMachineScheduler(MachineSchedContext *C) { +  const PPCSubtarget &ST = C->MF->getSubtarget<PPCSubtarget>(); +  ScheduleDAGMILive *DAG = +    new ScheduleDAGMILive(C, ST.usePPCPreRASchedStrategy() ? +                          llvm::make_unique<PPCPreRASchedStrategy>(C) : +                          llvm::make_unique<GenericScheduler>(C)); +  // add DAG Mutations here. +  DAG->addMutation(createCopyConstrainDAGMutation(DAG->TII, DAG->TRI)); +  return DAG; +} + +static ScheduleDAGInstrs *createPPCPostMachineScheduler( +  MachineSchedContext *C) { +  const PPCSubtarget &ST = C->MF->getSubtarget<PPCSubtarget>(); +  ScheduleDAGMI *DAG = +    new ScheduleDAGMI(C, ST.usePPCPostRASchedStrategy() ? +                      llvm::make_unique<PPCPostRASchedStrategy>(C) : +                      llvm::make_unique<PostGenericScheduler>(C), true); +  // add DAG Mutations here. +  return DAG; +} +  // The FeatureString here is a little subtle. We are modifying the feature  // string with what are (currently) non-function specific overrides as it goes  // into the LLVMTargetMachine constructor and then using the stored value in the @@ -331,6 +370,14 @@ public:    void addPreRegAlloc() override;    void addPreSched2() override;    void addPreEmitPass() override; +  ScheduleDAGInstrs * +  createMachineScheduler(MachineSchedContext *C) const override { +    return createPPCMachineScheduler(C); +  } +  ScheduleDAGInstrs * +  createPostMachineScheduler(MachineSchedContext *C) const override { +    return createPPCPostMachineScheduler(C); +  }  };  } // end anonymous namespace @@ -374,7 +421,7 @@ bool PPCPassConfig::addPreISel() {      addPass(createPPCLoopPreIncPrepPass(getPPCTargetMachine()));    if (!DisableCTRLoops && getOptLevel() != CodeGenOpt::None) -    addPass(createPPCCTRLoops()); +    addPass(createHardwareLoopsPass());    return false;  } @@ -441,6 +488,9 @@ void PPCPassConfig::addPreRegAlloc() {    }    if (EnableExtraTOCRegDeps)      addPass(createPPCTOCRegDepsPass()); + +  if (getOptLevel() != CodeGenOpt::None) +    addPass(&MachinePipelinerID);  }  void PPCPassConfig::addPreSched2() { @@ -469,3 +519,13 @@ TargetTransformInfo  PPCTargetMachine::getTargetTransformInfo(const Function &F) {    return TargetTransformInfo(PPCTTIImpl(this, F));  } + +static MachineSchedRegistry +PPCPreRASchedRegistry("ppc-prera", +                      "Run PowerPC PreRA specific scheduler", +                      createPPCMachineScheduler); + +static MachineSchedRegistry +PPCPostRASchedRegistry("ppc-postra", +                       "Run PowerPC PostRA specific scheduler", +                       createPPCPostMachineScheduler);  | 
