mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	Summary: This patch makes use of AtomicExpandPass in Power for inserting fences around atomic as part of an effort to remove fence insertion from SelectionDAGBuilder. As a big bonus, it lets us use sync 1 (lightweight sync, often used by the mnemonic lwsync) instead of sync 0 (heavyweight sync) in many cases. I also added a test, as there was no test for the barriers emitted by the Power backend for atomic loads and stores. Test Plan: new test + make check-all Reviewers: jfb Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D5180 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218331 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			165 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
//===-- 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.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
//
 | 
						|
// Top-level implementation for the PowerPC target.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
#include "PPCTargetMachine.h"
 | 
						|
#include "PPC.h"
 | 
						|
#include "llvm/CodeGen/Passes.h"
 | 
						|
#include "llvm/MC/MCStreamer.h"
 | 
						|
#include "llvm/PassManager.h"
 | 
						|
#include "llvm/Support/CommandLine.h"
 | 
						|
#include "llvm/Support/FormattedStream.h"
 | 
						|
#include "llvm/Support/TargetRegistry.h"
 | 
						|
#include "llvm/Target/TargetOptions.h"
 | 
						|
using namespace llvm;
 | 
						|
 | 
						|
static cl::
 | 
						|
opt<bool> DisableCTRLoops("disable-ppc-ctrloops", cl::Hidden,
 | 
						|
                        cl::desc("Disable CTR loops for PPC"));
 | 
						|
 | 
						|
static cl::opt<bool>
 | 
						|
VSXFMAMutateEarly("schedule-ppc-vsx-fma-mutation-early",
 | 
						|
  cl::Hidden, cl::desc("Schedule VSX FMA instruction mutation early"));
 | 
						|
 | 
						|
extern "C" void LLVMInitializePowerPCTarget() {
 | 
						|
  // Register the targets
 | 
						|
  RegisterTargetMachine<PPC32TargetMachine> A(ThePPC32Target);
 | 
						|
  RegisterTargetMachine<PPC64TargetMachine> B(ThePPC64Target);
 | 
						|
  RegisterTargetMachine<PPC64TargetMachine> C(ThePPC64LETarget);
 | 
						|
}
 | 
						|
 | 
						|
PPCTargetMachine::PPCTargetMachine(const Target &T, StringRef TT, StringRef CPU,
 | 
						|
                                   StringRef FS, const TargetOptions &Options,
 | 
						|
                                   Reloc::Model RM, CodeModel::Model CM,
 | 
						|
                                   CodeGenOpt::Level OL)
 | 
						|
    : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL),
 | 
						|
      Subtarget(TT, CPU, FS, *this, OL) {
 | 
						|
  initAsmInfo();
 | 
						|
}
 | 
						|
 | 
						|
void PPC32TargetMachine::anchor() { }
 | 
						|
 | 
						|
PPC32TargetMachine::PPC32TargetMachine(const Target &T, StringRef TT,
 | 
						|
                                       StringRef CPU, StringRef FS,
 | 
						|
                                       const TargetOptions &Options,
 | 
						|
                                       Reloc::Model RM, CodeModel::Model CM,
 | 
						|
                                       CodeGenOpt::Level OL)
 | 
						|
  : PPCTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL) {
 | 
						|
}
 | 
						|
 | 
						|
void PPC64TargetMachine::anchor() { }
 | 
						|
 | 
						|
PPC64TargetMachine::PPC64TargetMachine(const Target &T, StringRef TT,
 | 
						|
                                       StringRef CPU,  StringRef FS,
 | 
						|
                                       const TargetOptions &Options,
 | 
						|
                                       Reloc::Model RM, CodeModel::Model CM,
 | 
						|
                                       CodeGenOpt::Level OL)
 | 
						|
  : PPCTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL) {
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
// Pass Pipeline Configuration
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
namespace {
 | 
						|
/// PPC Code Generator Pass Configuration Options.
 | 
						|
class PPCPassConfig : public TargetPassConfig {
 | 
						|
public:
 | 
						|
  PPCPassConfig(PPCTargetMachine *TM, PassManagerBase &PM)
 | 
						|
    : TargetPassConfig(TM, PM) {}
 | 
						|
 | 
						|
  PPCTargetMachine &getPPCTargetMachine() const {
 | 
						|
    return getTM<PPCTargetMachine>();
 | 
						|
  }
 | 
						|
 | 
						|
  const PPCSubtarget &getPPCSubtarget() const {
 | 
						|
    return *getPPCTargetMachine().getSubtargetImpl();
 | 
						|
  }
 | 
						|
 | 
						|
  void addIRPasses() override;
 | 
						|
  bool addPreISel() override;
 | 
						|
  bool addILPOpts() override;
 | 
						|
  bool addInstSelector() override;
 | 
						|
  bool addPreRegAlloc() override;
 | 
						|
  bool addPreSched2() override;
 | 
						|
  bool addPreEmitPass() override;
 | 
						|
};
 | 
						|
} // namespace
 | 
						|
 | 
						|
TargetPassConfig *PPCTargetMachine::createPassConfig(PassManagerBase &PM) {
 | 
						|
  return new PPCPassConfig(this, PM);
 | 
						|
}
 | 
						|
 | 
						|
void PPCPassConfig::addIRPasses() {
 | 
						|
  addPass(createAtomicExpandPass(&getPPCTargetMachine()));
 | 
						|
  TargetPassConfig::addIRPasses();
 | 
						|
}
 | 
						|
 | 
						|
bool PPCPassConfig::addPreISel() {
 | 
						|
  if (!DisableCTRLoops && getOptLevel() != CodeGenOpt::None)
 | 
						|
    addPass(createPPCCTRLoops(getPPCTargetMachine()));
 | 
						|
 | 
						|
  return false;
 | 
						|
}
 | 
						|
 | 
						|
bool PPCPassConfig::addILPOpts() {
 | 
						|
  addPass(&EarlyIfConverterID);
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
bool PPCPassConfig::addInstSelector() {
 | 
						|
  // Install an instruction selector.
 | 
						|
  addPass(createPPCISelDag(getPPCTargetMachine()));
 | 
						|
 | 
						|
#ifndef NDEBUG
 | 
						|
  if (!DisableCTRLoops && getOptLevel() != CodeGenOpt::None)
 | 
						|
    addPass(createPPCCTRLoopsVerify());
 | 
						|
#endif
 | 
						|
 | 
						|
  addPass(createPPCVSXCopyPass());
 | 
						|
  return false;
 | 
						|
}
 | 
						|
 | 
						|
bool PPCPassConfig::addPreRegAlloc() {
 | 
						|
  initializePPCVSXFMAMutatePass(*PassRegistry::getPassRegistry());
 | 
						|
  insertPass(VSXFMAMutateEarly ? &RegisterCoalescerID : &MachineSchedulerID,
 | 
						|
             &PPCVSXFMAMutateID);
 | 
						|
  return false;
 | 
						|
}
 | 
						|
 | 
						|
bool PPCPassConfig::addPreSched2() {
 | 
						|
  addPass(createPPCVSXCopyCleanupPass());
 | 
						|
 | 
						|
  if (getOptLevel() != CodeGenOpt::None)
 | 
						|
    addPass(&IfConverterID);
 | 
						|
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
bool PPCPassConfig::addPreEmitPass() {
 | 
						|
  if (getOptLevel() != CodeGenOpt::None)
 | 
						|
    addPass(createPPCEarlyReturnPass());
 | 
						|
  // Must run branch selection immediately preceding the asm printer.
 | 
						|
  addPass(createPPCBranchSelectionPass());
 | 
						|
  return false;
 | 
						|
}
 | 
						|
 | 
						|
void PPCTargetMachine::addAnalysisPasses(PassManagerBase &PM) {
 | 
						|
  // Add first the target-independent BasicTTI pass, then our PPC pass. This
 | 
						|
  // allows the PPC pass to delegate to the target independent layer when
 | 
						|
  // appropriate.
 | 
						|
  PM.add(createBasicTargetTransformInfoPass(this));
 | 
						|
  PM.add(createPPCTargetTransformInfoPass(this));
 | 
						|
}
 | 
						|
 |