mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-06 09:44:39 +00:00
R600: Split AMDGPUPassConfig into R600PassConfig and GCNPassConfig
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228850 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5b98db607b
commit
28f550eed1
@ -109,7 +109,7 @@ GCNTargetMachine::GCNTargetMachine(const Target &T, StringRef TT, StringRef FS,
|
||||
namespace {
|
||||
class AMDGPUPassConfig : public TargetPassConfig {
|
||||
public:
|
||||
AMDGPUPassConfig(AMDGPUTargetMachine *TM, PassManagerBase &PM)
|
||||
AMDGPUPassConfig(TargetMachine *TM, PassManagerBase &PM)
|
||||
: TargetPassConfig(TM, PM) {}
|
||||
|
||||
AMDGPUTargetMachine &getAMDGPUTargetMachine() const {
|
||||
@ -126,6 +126,25 @@ public:
|
||||
|
||||
void addIRPasses() override;
|
||||
void addCodeGenPrepare() override;
|
||||
virtual bool addPreISel() override;
|
||||
virtual bool addInstSelector() override;
|
||||
};
|
||||
|
||||
class R600PassConfig : public AMDGPUPassConfig {
|
||||
public:
|
||||
R600PassConfig(TargetMachine *TM, PassManagerBase &PM)
|
||||
: AMDGPUPassConfig(TM, PM) { }
|
||||
|
||||
bool addPreISel() override;
|
||||
void addPreRegAlloc() override;
|
||||
void addPreSched2() override;
|
||||
void addPreEmitPass() override;
|
||||
};
|
||||
|
||||
class GCNPassConfig : public AMDGPUPassConfig {
|
||||
public:
|
||||
GCNPassConfig(TargetMachine *TM, PassManagerBase &PM)
|
||||
: AMDGPUPassConfig(TM, PM) { }
|
||||
bool addPreISel() override;
|
||||
bool addInstSelector() override;
|
||||
void addPreRegAlloc() override;
|
||||
@ -133,11 +152,8 @@ public:
|
||||
void addPreSched2() override;
|
||||
void addPreEmitPass() override;
|
||||
};
|
||||
} // End of anonymous namespace
|
||||
|
||||
TargetPassConfig *AMDGPUTargetMachine::createPassConfig(PassManagerBase &PM) {
|
||||
return new AMDGPUPassConfig(this, PM);
|
||||
}
|
||||
} // End of anonymous namespace
|
||||
|
||||
TargetIRAnalysis AMDGPUTargetMachine::getTargetIRAnalysis() {
|
||||
return TargetIRAnalysis(
|
||||
@ -163,7 +179,6 @@ void AMDGPUPassConfig::addCodeGenPrepare() {
|
||||
addPass(createAMDGPUPromoteAlloca(ST));
|
||||
addPass(createSROAPass());
|
||||
}
|
||||
|
||||
TargetPassConfig::addCodeGenPrepare();
|
||||
}
|
||||
|
||||
@ -173,83 +188,96 @@ AMDGPUPassConfig::addPreISel() {
|
||||
addPass(createFlattenCFGPass());
|
||||
if (ST.IsIRStructurizerEnabled())
|
||||
addPass(createStructurizeCFGPass());
|
||||
if (ST.getGeneration() >= AMDGPUSubtarget::SOUTHERN_ISLANDS) {
|
||||
addPass(createSinkingPass());
|
||||
addPass(createSITypeRewriter());
|
||||
addPass(createSIAnnotateControlFlowPass());
|
||||
} else {
|
||||
addPass(createR600TextureIntrinsicsReplacer());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool AMDGPUPassConfig::addInstSelector() {
|
||||
const AMDGPUSubtarget &ST = TM->getSubtarget<AMDGPUSubtarget>();
|
||||
|
||||
addPass(createAMDGPUISelDag(getAMDGPUTargetMachine()));
|
||||
|
||||
if (ST.getGeneration() >= AMDGPUSubtarget::SOUTHERN_ISLANDS) {
|
||||
addPass(createSILowerI1CopiesPass());
|
||||
addPass(createSIFixSGPRCopiesPass(*TM));
|
||||
addPass(createSIFoldOperandsPass());
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void AMDGPUPassConfig::addPreRegAlloc() {
|
||||
const AMDGPUSubtarget &ST = TM->getSubtarget<AMDGPUSubtarget>();
|
||||
//===----------------------------------------------------------------------===//
|
||||
// R600 Pass Setup
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
if (ST.getGeneration() <= AMDGPUSubtarget::NORTHERN_ISLANDS) {
|
||||
addPass(createR600VectorRegMerger(*TM));
|
||||
} else {
|
||||
if (getOptLevel() > CodeGenOpt::None && ST.loadStoreOptEnabled()) {
|
||||
// Don't do this with no optimizations since it throws away debug info by
|
||||
// merging nonadjacent loads.
|
||||
|
||||
// This should be run after scheduling, but before register allocation. It
|
||||
// also need extra copies to the address operand to be eliminated.
|
||||
initializeSILoadStoreOptimizerPass(*PassRegistry::getPassRegistry());
|
||||
insertPass(&MachineSchedulerID, &SILoadStoreOptimizerID);
|
||||
}
|
||||
|
||||
addPass(createSIShrinkInstructionsPass(), false);
|
||||
addPass(createSIFixSGPRLiveRangesPass(), false);
|
||||
}
|
||||
bool R600PassConfig::addPreISel() {
|
||||
AMDGPUPassConfig::addPreISel();
|
||||
addPass(createR600TextureIntrinsicsReplacer());
|
||||
return false;
|
||||
}
|
||||
|
||||
void AMDGPUPassConfig::addPostRegAlloc() {
|
||||
const AMDGPUSubtarget &ST = TM->getSubtarget<AMDGPUSubtarget>();
|
||||
|
||||
if (ST.getGeneration() > AMDGPUSubtarget::NORTHERN_ISLANDS) {
|
||||
addPass(createSIPrepareScratchRegs(), false);
|
||||
addPass(createSIShrinkInstructionsPass(), false);
|
||||
}
|
||||
void R600PassConfig::addPreRegAlloc() {
|
||||
addPass(createR600VectorRegMerger(*TM));
|
||||
}
|
||||
|
||||
void AMDGPUPassConfig::addPreSched2() {
|
||||
void R600PassConfig::addPreSched2() {
|
||||
const AMDGPUSubtarget &ST = TM->getSubtarget<AMDGPUSubtarget>();
|
||||
|
||||
if (ST.getGeneration() <= AMDGPUSubtarget::NORTHERN_ISLANDS)
|
||||
addPass(createR600EmitClauseMarkers(), false);
|
||||
addPass(createR600EmitClauseMarkers(), false);
|
||||
if (ST.isIfCvtEnabled())
|
||||
addPass(&IfConverterID, false);
|
||||
if (ST.getGeneration() <= AMDGPUSubtarget::NORTHERN_ISLANDS)
|
||||
addPass(createR600ClauseMergePass(*TM), false);
|
||||
if (ST.getGeneration() >= AMDGPUSubtarget::SOUTHERN_ISLANDS) {
|
||||
addPass(createSIInsertWaits(*TM), false);
|
||||
}
|
||||
addPass(createR600ClauseMergePass(*TM), false);
|
||||
}
|
||||
|
||||
void AMDGPUPassConfig::addPreEmitPass() {
|
||||
const AMDGPUSubtarget &ST = TM->getSubtarget<AMDGPUSubtarget>();
|
||||
if (ST.getGeneration() <= AMDGPUSubtarget::NORTHERN_ISLANDS) {
|
||||
addPass(createAMDGPUCFGStructurizerPass(), false);
|
||||
addPass(createR600ExpandSpecialInstrsPass(*TM), false);
|
||||
addPass(&FinalizeMachineBundlesID, false);
|
||||
addPass(createR600Packetizer(*TM), false);
|
||||
addPass(createR600ControlFlowFinalizer(*TM), false);
|
||||
} else {
|
||||
addPass(createSILowerControlFlowPass(*TM), false);
|
||||
}
|
||||
void R600PassConfig::addPreEmitPass() {
|
||||
addPass(createAMDGPUCFGStructurizerPass(), false);
|
||||
addPass(createR600ExpandSpecialInstrsPass(*TM), false);
|
||||
addPass(&FinalizeMachineBundlesID, false);
|
||||
addPass(createR600Packetizer(*TM), false);
|
||||
addPass(createR600ControlFlowFinalizer(*TM), false);
|
||||
}
|
||||
|
||||
TargetPassConfig *R600TargetMachine::createPassConfig(PassManagerBase &PM) {
|
||||
return new R600PassConfig(this, PM);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// GCN Pass Setup
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
bool GCNPassConfig::addPreISel() {
|
||||
AMDGPUPassConfig::addPreISel();
|
||||
addPass(createSinkingPass());
|
||||
addPass(createSITypeRewriter());
|
||||
addPass(createSIAnnotateControlFlowPass());
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GCNPassConfig::addInstSelector() {
|
||||
AMDGPUPassConfig::addInstSelector();
|
||||
addPass(createSILowerI1CopiesPass());
|
||||
addPass(createSIFixSGPRCopiesPass(*TM));
|
||||
addPass(createSIFoldOperandsPass());
|
||||
return false;
|
||||
}
|
||||
|
||||
void GCNPassConfig::addPreRegAlloc() {
|
||||
const AMDGPUSubtarget &ST = TM->getSubtarget<AMDGPUSubtarget>();
|
||||
if (getOptLevel() > CodeGenOpt::None && ST.loadStoreOptEnabled()) {
|
||||
// Don't do this with no optimizations since it throws away debug info by
|
||||
// merging nonadjacent loads.
|
||||
|
||||
// This should be run after scheduling, but before register allocation. It
|
||||
// also need extra copies to the address operand to be eliminated.
|
||||
initializeSILoadStoreOptimizerPass(*PassRegistry::getPassRegistry());
|
||||
insertPass(&MachineSchedulerID, &SILoadStoreOptimizerID);
|
||||
}
|
||||
addPass(createSIShrinkInstructionsPass(), false);
|
||||
addPass(createSIFixSGPRLiveRangesPass(), false);
|
||||
}
|
||||
|
||||
void GCNPassConfig::addPostRegAlloc() {
|
||||
addPass(createSIPrepareScratchRegs(), false);
|
||||
addPass(createSIShrinkInstructionsPass(), false);
|
||||
}
|
||||
|
||||
void GCNPassConfig::addPreSched2() {
|
||||
addPass(createSIInsertWaits(*TM), false);
|
||||
}
|
||||
|
||||
void GCNPassConfig::addPreEmitPass() {
|
||||
addPass(createSILowerControlFlowPass(*TM), false);
|
||||
}
|
||||
|
||||
TargetPassConfig *GCNTargetMachine::createPassConfig(PassManagerBase &PM) {
|
||||
return new GCNPassConfig(this, PM);
|
||||
}
|
||||
|
@ -53,8 +53,6 @@ public:
|
||||
const AMDGPUIntrinsicInfo *getIntrinsicInfo() const override {
|
||||
return &IntrinsicInfo;
|
||||
}
|
||||
TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
|
||||
|
||||
TargetIRAnalysis getTargetIRAnalysis() override;
|
||||
|
||||
TargetLoweringObjectFile *getObjFileLowering() const override {
|
||||
@ -72,6 +70,8 @@ public:
|
||||
R600TargetMachine(const Target &T, StringRef TT, StringRef FS,
|
||||
StringRef CPU, TargetOptions Options, Reloc::Model RM,
|
||||
CodeModel::Model CM, CodeGenOpt::Level OL);
|
||||
|
||||
TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
|
||||
};
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -84,6 +84,8 @@ public:
|
||||
GCNTargetMachine(const Target &T, StringRef TT, StringRef FS,
|
||||
StringRef CPU, TargetOptions Options, Reloc::Model RM,
|
||||
CodeModel::Model CM, CodeGenOpt::Level OL);
|
||||
|
||||
TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
|
||||
};
|
||||
|
||||
} // End namespace llvm
|
||||
|
Loading…
x
Reference in New Issue
Block a user