P4 to Git Change 1293547 by smekhano@stas-rampitec-hsa on 2016/07/20 11:43:35

SWDEV-97737 - Complib: fix unrolling preferences on the online path
	The TargetTransformInfo needs to be added to pass manager before other passes now.
	Otherwise the first pass which requires this analysis will create a default TTI on initialization
	and when real HSAILTTIImpl will be added to PM, PM->add() will silently delete this new analysis pass
	on the basis that a pass with such ID already exists in the pass manager.
	That is in fact concern for all analysis passes.

	Testing: smoke, precheckin, LDSReadSpeed
	Reviewed by Daniil Fukalov

Affected files ...

... //depot/stg/opencl/drivers/opencl/compiler/lib/backends/common/opt_level.cpp#32 edit
... //depot/stg/opencl/drivers/opencl/compiler/lib/backends/common/opt_level.hpp#6 edit
Этот коммит содержится в:
foreman committed 2016-07-20 12:20:58 -04:00
1 родитель e1a1da0a49
Коммит a46f607eb0
2 files changed
+75 -78

No files matched your search

+68 -70
Просмотреть файл
@@ -24,7 +24,7 @@ using namespace amdcl;
using namespace llvm; using namespace llvm;
void void
OptLevel::setup(bool isGPU, uint32_t OptLevel) OptLevel::setup(aclBinary *elf, bool isGPU, uint32_t OptLevel)
{ {
// Add an appropriate DataLayout instance for this module. // Add an appropriate DataLayout instance for this module.
#if defined(LEGACY_COMPLIB) #if defined(LEGACY_COMPLIB)
@@ -35,6 +35,66 @@ OptLevel::setup(bool isGPU, uint32_t OptLevel)
fpasses_ = new legacy::FunctionPassManager(module_); fpasses_ = new legacy::FunctionPassManager(module_);
#endif #endif
const aclTargetInfo* trg = aclutGetTargetInfo(elf);
if (trg) {
llvm::Triple TheTriple(getTriple(trg->arch_id));
if (TheTriple.getArch()) {
std::string Error;
llvm::StringRef MArch(aclGetArchitecture(*trg));
const Target *TheTarget = TargetRegistry::lookupTarget(MArch, TheTriple,
Error);
if (TheTarget) {
llvm::TargetOptions targetOptions;
targetOptions.StackAlignmentOverride = Options()->oVariables->CPUStackAlignment;
#ifdef WITH_TARGET_HSAIL
if (Options()->libraryType_ == amd::GPU_Library_HSAIL)
targetOptions.UnsafeFPMath = Options()->oVariables->UnsafeMathOpt;
#endif
targetOptions.LessPreciseFPMADOption = Options()->oVariables->MadEnable ||
Options()->oVariables->EnableMAD;
targetOptions.NoInfsFPMath = targetOptions.NoNaNsFPMath
= Options()->oVariables->FiniteMathOnly;
for (auto &F : *module_) {
auto Attrs = F.getAttributes();
Attrs = Attrs.addAttribute(F.getContext(), AttributeSet::FunctionIndex,
"no-frame-pointer-elim", "false");
F.setAttributes(Attrs);
}
llvm::CodeGenOpt::Level OLvl = CodeGenOpt::None;
switch (Options()->oVariables->OptLevel) {
case 0: // -O0
OLvl = CodeGenOpt::None;
break;
case 1: // -O1
OLvl = CodeGenOpt::Less;
break;
case 2: // -O2
case 5: // -O5(-Os)
OLvl = CodeGenOpt::Default;
break;
case 3: // -O3
case 4: // -O4
OLvl = CodeGenOpt::Aggressive;
break;
default:
assert(!"Error with optimization level");
};
TM = TheTarget->createTargetMachine(TheTriple.getTriple(),
aclutGetCodegenName(elf->target),
getFeatureString(elf->target, Options()),
targetOptions,
WINDOWS_SWITCH(Reloc::DynamicNoPIC, Reloc::PIC_),
CodeModel::Default, OLvl);
}
}
}
if (TM) {
passes_.add(createTargetTransformInfoWrapperPass(TM->getTargetIRAnalysis()));
fpasses_->add(createTargetTransformInfoWrapperPass(TM->getTargetIRAnalysis()));
}
PassManagerBuilder Builder; PassManagerBuilder Builder;
Builder.OptLevel = OptLevel; Builder.OptLevel = OptLevel;
@@ -96,68 +156,6 @@ OptLevel::setup(bool isGPU, uint32_t OptLevel)
void void
OptLevel::run(aclBinary *elf) OptLevel::run(aclBinary *elf)
{ {
#if !defined(LEGACY_COMPLIB)
const aclTargetInfo* trg = aclutGetTargetInfo(elf);
TargetMachine *Machine = nullptr;
if (trg) {
llvm::Triple TheTriple(getTriple(trg->arch_id));
if (TheTriple.getArch()) {
std::string Error;
llvm::StringRef MArch(aclGetArchitecture(*trg));
const Target *TheTarget = TargetRegistry::lookupTarget(MArch, TheTriple,
Error);
if (TheTarget) {
llvm::TargetOptions targetOptions;
targetOptions.StackAlignmentOverride = Options()->oVariables->CPUStackAlignment;
#ifdef WITH_TARGET_HSAIL
if (Options()->libraryType_ == amd::GPU_Library_HSAIL)
targetOptions.UnsafeFPMath = Options()->oVariables->UnsafeMathOpt;
#endif
targetOptions.LessPreciseFPMADOption = Options()->oVariables->MadEnable ||
Options()->oVariables->EnableMAD;
targetOptions.NoInfsFPMath = targetOptions.NoNaNsFPMath
= Options()->oVariables->FiniteMathOnly;
for (auto &F : *module_) {
auto Attrs = F.getAttributes();
Attrs = Attrs.addAttribute(F.getContext(), AttributeSet::FunctionIndex,
"no-frame-pointer-elim", "false");
F.setAttributes(Attrs);
}
llvm::CodeGenOpt::Level OLvl = CodeGenOpt::None;
switch (Options()->oVariables->OptLevel) {
case 0: // -O0
OLvl = CodeGenOpt::None;
break;
case 1: // -O1
OLvl = CodeGenOpt::Less;
break;
case 2: // -O2
case 5: // -O5(-Os)
OLvl = CodeGenOpt::Default;
break;
case 3: // -O3
case 4: // -O4
OLvl = CodeGenOpt::Aggressive;
break;
default:
assert(!"Error with optimization level");
};
Machine = TheTarget->createTargetMachine(TheTriple.getTriple(),
aclutGetCodegenName(elf->target),
getFeatureString(elf->target, Options()),
targetOptions,
WINDOWS_SWITCH(Reloc::DynamicNoPIC, Reloc::PIC_),
CodeModel::Default, OLvl);
}
}
}
std::unique_ptr<TargetMachine> TM(Machine);
if (TM.get())
fpasses_->add(createTargetTransformInfoWrapperPass(TM->getTargetIRAnalysis()));
#endif
if (Options()->oVariables->OptPrintLiveness) { if (Options()->oVariables->OptPrintLiveness) {
Passes().add(createAMDLivenessPrinterPass()); Passes().add(createAMDLivenessPrinterPass());
} }
@@ -183,7 +181,7 @@ O0OptLevel::optimize(aclBinary *elf, Module *input, bool isGPU)
} else } else
#endif #endif
{ {
setup(false, 0); setup(elf, false, 0);
run(elf); run(elf);
} }
return 0; return 0;
@@ -194,7 +192,7 @@ GPUO0OptLevel::optimize(aclBinary *elf, Module *input, bool isGPU)
{ {
module_ = input; module_ = input;
assert(isGPU && "Only a GPU can use GPUO0OptLevel!\n"); assert(isGPU && "Only a GPU can use GPUO0OptLevel!\n");
setup(true, 0); setup(elf, true, 0);
#ifdef WITH_TARGET_HSAIL #ifdef WITH_TARGET_HSAIL
if (Options()->libraryType_ == amd::GPU_Library_HSAIL) { if (Options()->libraryType_ == amd::GPU_Library_HSAIL) {
// On the GPU, even with -O0, we must do some optimizations. One // On the GPU, even with -O0, we must do some optimizations. One
@@ -233,7 +231,7 @@ int
O1OptLevel::optimize(aclBinary *elf, Module *input, bool isGPU) O1OptLevel::optimize(aclBinary *elf, Module *input, bool isGPU)
{ {
module_ = input; module_ = input;
setup(isGPU, 1); setup(elf, isGPU, 1);
run(elf); run(elf);
return 0; return 0;
} }
@@ -242,7 +240,7 @@ int
O2OptLevel::optimize(aclBinary *elf, Module *input, bool isGPU) O2OptLevel::optimize(aclBinary *elf, Module *input, bool isGPU)
{ {
module_ = input; module_ = input;
setup(isGPU, 2); setup(elf, isGPU, 2);
run(elf); run(elf);
return 0; return 0;
} }
@@ -251,7 +249,7 @@ int
O3OptLevel::optimize(aclBinary *elf, Module *input, bool isGPU) O3OptLevel::optimize(aclBinary *elf, Module *input, bool isGPU)
{ {
module_ = input; module_ = input;
setup(isGPU, 3); setup(elf, isGPU, 3);
run(elf); run(elf);
return 0; return 0;
} }
@@ -260,7 +258,7 @@ int
O4OptLevel::optimize(aclBinary *elf, Module *input, bool isGPU) O4OptLevel::optimize(aclBinary *elf, Module *input, bool isGPU)
{ {
module_ = input; module_ = input;
setup(isGPU, 4); setup(elf, isGPU, 4);
run(elf); run(elf);
return 0; return 0;
} }
@@ -269,7 +267,7 @@ int
OsOptLevel::optimize(aclBinary *elf, Module *input, bool isGPU) OsOptLevel::optimize(aclBinary *elf, Module *input, bool isGPU)
{ {
module_ = input; module_ = input;
setup(isGPU, 5); setup(elf, isGPU, 5);
run(elf); run(elf);
return 0; return 0;
} }
+7 -8
Просмотреть файл
@@ -11,12 +11,10 @@
#undef DEBUG #undef DEBUG
#endif #endif
#if defined(LEGACY_COMPLIB)
#include "llvm/PassManager.h"
#else
#include "llvm/IR/LegacyPassManager.h"
#endif
#include "llvm/Analysis/Passes.h" #include "llvm/Analysis/Passes.h"
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/Target/TargetMachine.h"
namespace llvm { namespace llvm {
class Module; class Module;
@@ -42,13 +40,13 @@ namespace amdcl
public: public:
OptLevel(amd::option::Options *OptionsObj) OptLevel(amd::option::Options *OptionsObj)
: opts_(OptionsObj) {} : opts_(OptionsObj), TM(nullptr) {}
virtual ~OptLevel() {} virtual ~OptLevel() { delete TM; }
virtual int optimize(aclBinary *elf, llvm::Module *input, bool isGPU) = 0; virtual int optimize(aclBinary *elf, llvm::Module *input, bool isGPU) = 0;
protected: protected:
void setup(bool isGPU, uint32_t OptLevel); void setup(aclBinary *elf, bool isGPU, uint32_t OptLevel);
void run(aclBinary *elf); void run(aclBinary *elf);
LLVM_LEGACY_NAMESPACE::PassManager& Passes() { return passes_; } LLVM_LEGACY_NAMESPACE::PassManager& Passes() { return passes_; }
LLVM_LEGACY_NAMESPACE::FunctionPassManager& FPasses() { return (*fpasses_); } LLVM_LEGACY_NAMESPACE::FunctionPassManager& FPasses() { return (*fpasses_); }
@@ -58,6 +56,7 @@ namespace amdcl
LLVM_LEGACY_NAMESPACE::FunctionPassManager *fpasses_; LLVM_LEGACY_NAMESPACE::FunctionPassManager *fpasses_;
LLVM_LEGACY_NAMESPACE::PassManager passes_; LLVM_LEGACY_NAMESPACE::PassManager passes_;
amd::option::Options *opts_; amd::option::Options *opts_;
llvm::TargetMachine* TM;
}; // class OptLevel }; // class OptLevel
/*@}*/ /*@}*/