This is an automated email from the ASF dual-hosted git repository.
syfeng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git
The following commit(s) were added to refs/heads/main by this push:
new 71caa19f96 [LLVM] Fix for llvm CodeGenOpt API change (#15921)
71caa19f96 is described below
commit 71caa19f96adcf2796ce4ad00ac7bd2669f3e5ad
Author: Anirudh Sundar Subramaniam <[email protected]>
AuthorDate: Fri Oct 13 08:45:05 2023 +0530
[LLVM] Fix for llvm CodeGenOpt API change (#15921)
This patch fixes the errors caused due to recent API change from LLVM
for CodeGenOpt made in [this
PR](https://github.com/llvm/llvm-project/pull/66295)
---
src/target/llvm/codegen_amdgpu.cc | 11 ++++++--
src/target/llvm/codegen_hexagon.cc | 5 +++-
src/target/llvm/codegen_llvm.cc | 18 ++++++++++++++
src/target/llvm/codegen_nvptx.cc | 5 +++-
src/target/llvm/llvm_instance.cc | 51 +++++++++++++++++++++++++++++++++++++-
src/target/llvm/llvm_instance.h | 8 ++++++
src/target/llvm/llvm_module.cc | 14 +++++++++--
7 files changed, 105 insertions(+), 7 deletions(-)
diff --git a/src/target/llvm/codegen_amdgpu.cc
b/src/target/llvm/codegen_amdgpu.cc
index 0ab4771f6c..80c2abb5f1 100644
--- a/src/target/llvm/codegen_amdgpu.cc
+++ b/src/target/llvm/codegen_amdgpu.cc
@@ -302,9 +302,12 @@ runtime::Module BuildAMDGPU(IRModule mod, Target target) {
#elif TVM_LLVM_VERSION <= 90
ICHECK(tm->addPassesToEmitFile(pass, destObj, nullptr,
llvm::TargetMachine::CGFT_ObjectFile) == 0)
<< "Cannot emit target CGFT_ObjectFile";
-#else
+#elif TVM_LLVM_VERSION <= 170
ICHECK(tm->addPassesToEmitFile(pass, destObj, nullptr,
llvm::CGFT_ObjectFile) == 0)
<< "Cannot emit target CGFT_ObjectFile";
+#else
+ ICHECK(tm->addPassesToEmitFile(pass, destObj, nullptr,
llvm::CodeGenFileType::ObjectFile) == 0)
+ << "Cannot emit target CodeGenFileType::ObjectFile";
#endif
pass.run(*mObj);
std::string obj(dataObj.begin(), dataObj.end());
@@ -317,9 +320,13 @@ runtime::Module BuildAMDGPU(IRModule mod, Target target) {
ICHECK(tm->addPassesToEmitFile(passAsm, destAsm, nullptr,
llvm::TargetMachine::CGFT_AssemblyFile) == 0)
<< "Cannot emit target CGFT_AssemblyFile";
-#else
+#elif TVM_LLVM_VERSION <= 170
ICHECK(tm->addPassesToEmitFile(passAsm, destAsm, nullptr,
llvm::CGFT_AssemblyFile) == 0)
<< "Cannot emit target CGFT_AssemblyFile";
+#else
+ ICHECK(tm->addPassesToEmitFile(passAsm, destAsm, nullptr,
llvm::CodeGenFileType::AssemblyFile) ==
+ 0)
+ << "Cannot emit target CGFT_AssemblyFile";
#endif
passAsm.run(*mAsm);
std::string assembly(dataAsm.begin(), dataAsm.end());
diff --git a/src/target/llvm/codegen_hexagon.cc
b/src/target/llvm/codegen_hexagon.cc
index 2d0945c704..8b884669c3 100644
--- a/src/target/llvm/codegen_hexagon.cc
+++ b/src/target/llvm/codegen_hexagon.cc
@@ -588,8 +588,11 @@ runtime::Module BuildHexagon(IRModule mod, Target target) {
#if TVM_LLVM_VERSION <= 90
auto ft = cgft == Asm ?
llvm::TargetMachine::CodeGenFileType::CGFT_AssemblyFile
:
llvm::TargetMachine::CodeGenFileType::CGFT_ObjectFile;
-#else
+#elif TVM_LLVM_VERSION <= 170
auto ft = cgft == Asm ? llvm::CGFT_AssemblyFile : llvm::CGFT_ObjectFile;
+#else
+ auto ft =
+ cgft == Asm ? llvm::CodeGenFileType::AssemblyFile :
llvm::CodeGenFileType::ObjectFile;
#endif
llvm::SmallString<16384> ss; // Will grow on demand.
diff --git a/src/target/llvm/codegen_llvm.cc b/src/target/llvm/codegen_llvm.cc
index 02d203b7e9..3d4d3def24 100644
--- a/src/target/llvm/codegen_llvm.cc
+++ b/src/target/llvm/codegen_llvm.cc
@@ -429,6 +429,7 @@ void CodeGenLLVM::Optimize() {
// Construct the default pass pipeline depending on the opt level.
std::string pipeline;
+#if TVM_LLVM_VERSION <= 170
switch (llvm_target_->GetOptLevel()) {
case llvm::CodeGenOpt::Level::None:
pipeline = "default<O0>";
@@ -444,6 +445,23 @@ void CodeGenLLVM::Optimize() {
pipeline = "default<O3>";
break;
}
+#else
+ switch (llvm_target_->GetOptLevel()) {
+ case llvm::CodeGenOptLevel::None:
+ pipeline = "default<O0>";
+ break;
+ case llvm::CodeGenOptLevel::Less:
+ pipeline = "default<O1>";
+ break;
+ case llvm::CodeGenOptLevel::Default:
+ pipeline = "default<O2>";
+ break;
+ default:
+ // CodeGenOptLevel::Aggressive
+ pipeline = "default<O3>";
+ break;
+ }
+#endif
llvm::StandardInstrumentations si(*llvm_target_->GetContext(),
debug_logging, verify_each);
#if LLVM_VERSION_MAJOR >= 17
diff --git a/src/target/llvm/codegen_nvptx.cc b/src/target/llvm/codegen_nvptx.cc
index b6c19c92d7..0b13fce678 100644
--- a/src/target/llvm/codegen_nvptx.cc
+++ b/src/target/llvm/codegen_nvptx.cc
@@ -345,9 +345,12 @@ runtime::Module BuildNVPTX(IRModule mod, Target target) {
ICHECK(tm->addPassesToEmitFile(pass, dest_ptx, nullptr,
llvm::TargetMachine::CGFT_AssemblyFile) ==
0)
<< "Cannot emit target CGFT_ObjectFile";
-#else
+#elif TVM_LLVM_VERSION <= 170
ICHECK(tm->addPassesToEmitFile(pass, dest_ptx, nullptr,
llvm::CGFT_AssemblyFile) == 0)
<< "Cannot emit target CGFT_ObjectFile";
+#else
+ ICHECK(tm->addPassesToEmitFile(pass, dest_ptx, nullptr,
llvm::CodeGenFileType::AssemblyFile) == 0)
+ << "Cannot emit target CodeGenFileType::ObjectFile";
#endif
pass.run(*module);
std::string ptx(data_ptx.begin(), data_ptx.end());
diff --git a/src/target/llvm/llvm_instance.cc b/src/target/llvm/llvm_instance.cc
index e270a9b66c..5079822277 100644
--- a/src/target/llvm/llvm_instance.cc
+++ b/src/target/llvm/llvm_instance.cc
@@ -94,7 +94,11 @@ namespace codegen {
namespace {
namespace defaults {
static const char* cpu = "generic";
+#if TVM_LLVM_VERSION <= 170
static const llvm::CodeGenOpt::Level opt_level = llvm::CodeGenOpt::Aggressive;
+#else
+static const llvm::CodeGenOptLevel opt_level =
llvm::CodeGenOptLevel::Aggressive;
+#endif
} // namespace defaults
} // namespace
@@ -258,7 +262,7 @@ LLVMTargetInfo::LLVMTargetInfo(LLVMInstance& instance,
const Target& target) {
}
auto maybe_level = target->GetAttr<Integer>("opt-level");
-
+#if TVM_LLVM_VERSION <= 170
if (maybe_level.defined()) {
int level = maybe_level.value()->value;
if (level <= 0) {
@@ -274,6 +278,23 @@ LLVMTargetInfo::LLVMTargetInfo(LLVMInstance& instance,
const Target& target) {
} else {
opt_level_ = defaults::opt_level;
}
+#else
+ if (maybe_level.defined()) {
+ int level = maybe_level.value()->value;
+ if (level <= 0) {
+ opt_level_ = llvm::CodeGenOptLevel::None;
+ } else if (level == 1) {
+ opt_level_ = llvm::CodeGenOptLevel::Less;
+ } else if (level == 2) {
+ opt_level_ = llvm::CodeGenOptLevel::Default;
+ } else {
+ // level >= 3
+ opt_level_ = llvm::CodeGenOptLevel::Aggressive;
+ }
+ } else {
+ opt_level_ = defaults::opt_level;
+ }
+#endif
target_options_.UseInitArray = true;
@@ -338,7 +359,11 @@ static llvm::TargetMachine* CreateLLVMTargetMachine(
const llvm::Target* llvm_instance, const std::string& triple, const
std::string& cpu,
const std::string& features, const llvm::TargetOptions& target_options,
const llvm::Reloc::Model& reloc_model, const llvm::CodeModel::Model&
code_model,
+#if TVM_LLVM_VERSION <= 170
const llvm::CodeGenOpt::Level& opt_level) {
+#else
+ const llvm::CodeGenOptLevel& opt_level) {
+#endif
llvm::TargetMachine* tm = llvm_instance->createTargetMachine(
triple, cpu, features, target_options, reloc_model, code_model,
opt_level);
ICHECK(tm != nullptr);
@@ -356,7 +381,11 @@ static const llvm::MCSubtargetInfo*
GetLLVMSubtargetInfo(const std::string& trip
llvm::TargetOptions target_options;
auto tm = CreateLLVMTargetMachine(llvm_instance, triple, cpu_name, feats,
target_options,
llvm::Reloc::Static,
llvm::CodeModel::Small,
+#if TVM_LLVM_VERSION <= 170
llvm::CodeGenOpt::Level(0));
+#else
+ llvm::CodeGenOptLevel(0));
+#endif
// create subtarget info module
const llvm::MCSubtargetInfo* MCInfo = tm->getMCSubtargetInfo();
@@ -435,6 +464,7 @@ std::string LLVMTargetInfo::str() const {
#endif
}
+#if TVM_LLVM_VERSION <= 170
if (opt_level_ != defaults::opt_level) {
os << " -opt-level=";
switch (opt_level_) {
@@ -452,6 +482,25 @@ std::string LLVMTargetInfo::str() const {
break;
}
}
+#else
+ if (opt_level_ != defaults::opt_level) {
+ os << " -opt-level=";
+ switch (opt_level_) {
+ case llvm::CodeGenOptLevel::None:
+ os << "0";
+ break;
+ case llvm::CodeGenOptLevel::Less:
+ os << "1";
+ break;
+ case llvm::CodeGenOptLevel::Default:
+ os << "2";
+ break;
+ case llvm::CodeGenOptLevel::Aggressive:
+ os << "3";
+ break;
+ }
+ }
+#endif
if (size_t num = llvm_options_.size(); num > 0) {
os << " -cl-opt=";
diff --git a/src/target/llvm/llvm_instance.h b/src/target/llvm/llvm_instance.h
index ac08008b80..030a7db721 100644
--- a/src/target/llvm/llvm_instance.h
+++ b/src/target/llvm/llvm_instance.h
@@ -216,7 +216,11 @@ class LLVMTargetInfo {
* \brief Get the LLVM optimization level
* \return optimization level for this target
*/
+#if TVM_LLVM_VERSION <= 170
llvm::CodeGenOpt::Level GetOptLevel() const { return opt_level_; }
+#else
+ llvm::CodeGenOptLevel GetOptLevel() const { return opt_level_; }
+#endif
/*!
* \class Option
@@ -312,7 +316,11 @@ class LLVMTargetInfo {
std::vector<Option> llvm_options_;
llvm::TargetOptions target_options_;
llvm::FastMathFlags fast_math_flags_;
+#if TVM_LLVM_VERSION <= 170
llvm::CodeGenOpt::Level opt_level_;
+#else
+ llvm::CodeGenOptLevel opt_level_;
+#endif
llvm::Reloc::Model reloc_model_ = llvm::Reloc::PIC_;
llvm::CodeModel::Model code_model_ = llvm::CodeModel::Small;
std::shared_ptr<llvm::TargetMachine> target_machine_;
diff --git a/src/target/llvm/llvm_module.cc b/src/target/llvm/llvm_module.cc
index 7878121410..4823f2c9ea 100644
--- a/src/target/llvm/llvm_module.cc
+++ b/src/target/llvm/llvm_module.cc
@@ -197,9 +197,12 @@ std::unique_ptr<llvm::Module>
CloneLLVMModule(llvm::Module* mod) { return llvm::
#if TVM_LLVM_VERSION <= 90
constexpr auto llvm_object_file_target = llvm::TargetMachine::CGFT_ObjectFile;
constexpr auto llvm_assembly_file_target =
llvm::TargetMachine::CGFT_AssemblyFile;
-#else
+#elif TVM_LLVM_VERSION <= 170
constexpr auto llvm_object_file_target = llvm::CGFT_ObjectFile;
constexpr auto llvm_assembly_file_target = llvm::CGFT_AssemblyFile;
+#else
+constexpr auto llvm_object_file_target = llvm::CodeGenFileType::ObjectFile;
+constexpr auto llvm_assembly_file_target = llvm::CodeGenFileType::AssemblyFile;
#endif
bool LLVMAddPassesToEmitFile(llvm::TargetMachine* tm,
llvm::legacy::PassManager* pm,
@@ -274,9 +277,12 @@ String LLVMModuleNode::GetSource(const String& format) {
#elif TVM_LLVM_VERSION <= 90
ICHECK(tm->addPassesToEmitFile(pass, rso, nullptr,
llvm::TargetMachine::CGFT_AssemblyFile) == 0)
<< "Cannot emit target CGFT_AssemblyFile";
-#else
+#elif TVM_LLVM_VERSION <= 170
ICHECK(tm->addPassesToEmitFile(pass, rso, nullptr,
llvm::CGFT_AssemblyFile) == 0)
<< "Cannot emit target CGFT_AssemblyFile";
+#else
+ ICHECK(tm->addPassesToEmitFile(pass, rso, nullptr,
llvm::CodeGenFileType::AssemblyFile) == 0)
+ << "Cannot emit target CodeGenFileType::AssemblyFile";
#endif
pass.run(*m);
return rso.str().str();
@@ -383,7 +389,11 @@ void LLVMModuleNode::LazyInitJIT() {
With<LLVMTarget> llvm_target(*llvm_instance_,
LLVMTarget::GetTargetMetadata(*module_));
llvm::EngineBuilder builder(std::move(module_owning_ptr_));
builder.setEngineKind(llvm::EngineKind::JIT);
+#if TVM_LLVM_VERSION <= 170
builder.setOptLevel(llvm::CodeGenOpt::Aggressive);
+#else
+ builder.setOptLevel(llvm::CodeGenOptLevel::Aggressive);
+#endif
builder.setMCPU(llvm_target->GetCPU());
builder.setMAttrs(llvm_target->GetTargetFeatures());
builder.setTargetOptions(llvm_target->GetTargetOptions());