diff --git a/projects/clr/rocclr/compiler/lib/backends/common/linker.cpp b/projects/clr/rocclr/compiler/lib/backends/common/linker.cpp index 6b81c67133..1a58d41cb4 100644 --- a/projects/clr/rocclr/compiler/lib/backends/common/linker.cpp +++ b/projects/clr/rocclr/compiler/lib/backends/common/linker.cpp @@ -690,6 +690,7 @@ amdcl::OCLLinker::link(llvm::Module* input, std::vectoroVariables->EnableBuildTiming) { diff --git a/projects/clr/rocclr/runtime/device/rocm/rocprogram.cpp b/projects/clr/rocclr/runtime/device/rocm/rocprogram.cpp index 599a72b937..8955c1b21c 100644 --- a/projects/clr/rocclr/runtime/device/rocm/rocprogram.cpp +++ b/projects/clr/rocclr/runtime/device/rocm/rocprogram.cpp @@ -833,8 +833,32 @@ namespace roc { return false; } + // open the optimized output + Data* opt_bc = C->NewBuffer(DT_LLVM_BC); + + if (!opt_bc) { + buildLog_ += "Error: Failed to open the optimized program.\n"; + return false; + } + + std::ostringstream optLevel; + optLevel << "-O" << options->oVariables->OptLevel; + + std::vector optOptions; + optOptions.push_back(optLevel.str()); + optOptions.push_back("-strip"); + optOptions.push_back("-instcombine"); + optOptions.push_back("-always-inline"); + + ret = C->OptimizeLLVMBitcode(linked_bc, opt_bc, optOptions); + buildLog_ += C->Output(); + if (!ret) { + buildLog_ += "Error: Optimizing bitcode failed: linking source & IR libraries.\n"; + return false; + } + inputs.clear(); - inputs.push_back(linked_bc); + inputs.push_back(opt_bc); Buffer* out_exec = C->NewBuffer(DT_EXECUTABLE); if (!out_exec) { @@ -848,9 +872,8 @@ namespace roc { optionsstr.append(" -mcpu="); optionsstr.append(dev().deviceInfo().machineTarget_); - std::ostringstream optLevel; - optLevel << " -O" << options->oVariables->OptLevel; - optionsstr.append(optLevel.str()); + // Set the -O# + optionsstr.append(" ").append(optLevel.str()); // Tokenize the options string into a vector of strings std::istringstream strstr(optionsstr);