From 1ed5b0b9c56f554cd93632e25258282eb834aa81 Mon Sep 17 00:00:00 2001 From: Jacob Lambert Date: Wed, 6 Sep 2023 17:40:14 -0400 Subject: [PATCH] Revert "SWDEV-410182: Link device-libs when compiling source to bitcode" This reverts commit 58e62063f3b7798b091a63bd434722c5282d9605. Reason for revert: There are currently some outstanding issues with the COMPILE_SOURCE_WITH_DEVICE_LIBS Comgr action (https://ontrack-internal.amd.com/browse/SWDEV-386072). Once these LLVM issues have been resovled, we can safely re-apply this patch Change-Id: I8501967af8496ea50d6e4a97399e45db51bbed1e [ROCm/clr commit: 19526e46e6155d143c6f42e0e83f2e3f857be2a0] --- projects/clr/rocclr/device/devprogram.cpp | 90 ++++++++++++++++++++--- projects/clr/rocclr/device/devprogram.hpp | 3 +- 2 files changed, 82 insertions(+), 11 deletions(-) diff --git a/projects/clr/rocclr/device/devprogram.cpp b/projects/clr/rocclr/device/devprogram.cpp index 6b41ea75ce..493f20b48d 100644 --- a/projects/clr/rocclr/device/devprogram.cpp +++ b/projects/clr/rocclr/device/devprogram.cpp @@ -348,7 +348,7 @@ amd_comgr_status_t Program::createAction(const amd_comgr_language_t oclver, bool Program::linkLLVMBitcode(const amd_comgr_data_set_t inputs, const std::vector& options, amd::option::Options* amdOptions, amd_comgr_data_set_t* output, - char* binaryData[], size_t* binarySize) { + char* binaryData[], size_t* binarySize, const bool link_dev_libs) { amd_comgr_language_t langver = getCOMGRLanguage(isHIP(), *amdOptions); if (langver == AMD_COMGR_LANGUAGE_NONE) { @@ -357,12 +357,28 @@ bool Program::linkLLVMBitcode(const amd_comgr_data_set_t inputs, // Create the action for linking amd_comgr_action_info_t action; + amd_comgr_data_set_t dataSetDevLibs; bool hasAction = false; + bool hasDataSetDevLibs = false; amd_comgr_status_t status = createAction(langver, options, &action, &hasAction); + if (link_dev_libs) { + if (status == AMD_COMGR_STATUS_SUCCESS) { + status = amd::Comgr::create_data_set(&dataSetDevLibs); + } + + if (status == AMD_COMGR_STATUS_SUCCESS) { + hasDataSetDevLibs = true; + status = amd::Comgr::do_action(AMD_COMGR_ACTION_ADD_DEVICE_LIBRARIES, action, inputs, + dataSetDevLibs); + extractBuildLog(dataSetDevLibs); + } + } + if (status == AMD_COMGR_STATUS_SUCCESS) { - status = amd::Comgr::do_action(AMD_COMGR_ACTION_LINK_BC_TO_BC, action, inputs, *output); + status = amd::Comgr::do_action(AMD_COMGR_ACTION_LINK_BC_TO_BC, action, + (link_dev_libs) ? dataSetDevLibs : inputs, *output); extractBuildLog(*output); } @@ -379,6 +395,10 @@ bool Program::linkLLVMBitcode(const amd_comgr_data_set_t inputs, amd::Comgr::destroy_action_info(action); } + if (hasDataSetDevLibs) { + amd::Comgr::destroy_data_set(dataSetDevLibs); + } + return (status == AMD_COMGR_STATUS_SUCCESS); } @@ -459,7 +479,7 @@ bool Program::compileToLLVMBitcode(const amd_comgr_data_set_t compileInputs, // Compiling the source codes with precompiled headers or directly compileInputs if (status == AMD_COMGR_STATUS_SUCCESS) { - status = amd::Comgr::do_action(AMD_COMGR_ACTION_COMPILE_SOURCE_WITH_DEVICE_LIBS_TO_BC, + status = amd::Comgr::do_action(AMD_COMGR_ACTION_COMPILE_SOURCE_TO_BC, action, input, output); extractBuildLog(output); } @@ -948,8 +968,9 @@ bool Program::linkImplLC(const std::vector& inputPrograms, char* binaryData = nullptr; size_t binarySize = 0; std::vector linkOptions; + constexpr bool kLinkDevLibs = false; bool ret = linkLLVMBitcode(inputs, linkOptions, options, &output, &binaryData, - &binarySize); + &binarySize, kLinkDevLibs); amd::Comgr::destroy_data_set(output); amd::Comgr::destroy_data_set(inputs); @@ -1119,19 +1140,14 @@ bool Program::linkImplLC(amd::option::Options* options) { return false; } + bool bLinkLLVMBitcode = true; if (llvmBinary_.empty()) { continueCompileFrom = getNextCompilationStageFromBinary(options); } - switch (continueCompileFrom) { case FILE_TYPE_CG: case FILE_TYPE_LLVMIR_BINARY: { - if(addCodeObjData(llvmBinary_.data(), llvmBinary_.size(), - AMD_COMGR_DATA_KIND_BC, - "LLVM Binary.bc", &inputs) != AMD_COMGR_STATUS_SUCCESS) { - return false; - } break; } case FILE_TYPE_ASM_TEXT: { @@ -1146,6 +1162,7 @@ bool Program::linkImplLC(amd::option::Options* options) { return false; } + bLinkLLVMBitcode = false; break; } case FILE_TYPE_ISA: { @@ -1168,6 +1185,59 @@ bool Program::linkImplLC(amd::option::Options* options) { return false; } + // call LinkLLVMBitcode + if (bLinkLLVMBitcode) { + // open the bitcode libraries + std::vector linkOptions; + + if (options->oVariables->FP32RoundDivideSqrt) { + linkOptions.push_back("correctly_rounded_sqrt"); + } + if (options->oVariables->DenormsAreZero || AMD_GPU_FORCE_SINGLE_FP_DENORM == 0 || + (device().isa().versionMajor() < 9 && AMD_GPU_FORCE_SINGLE_FP_DENORM < 0)) { + linkOptions.push_back("daz_opt"); + } + if (options->oVariables->FiniteMathOnly || options->oVariables->FastRelaxedMath) { + linkOptions.push_back("finite_only"); + } + if (options->oVariables->UnsafeMathOpt || options->oVariables->FastRelaxedMath) { + linkOptions.push_back("unsafe_math"); + } + if (device().settings().lcWavefrontSize64_) { + linkOptions.push_back("wavefrontsize64"); + } + linkOptions.push_back("code_object_v" + std::to_string(options->oVariables->LCCodeObjectVersion)); + + amd_comgr_status_t status = addCodeObjData(llvmBinary_.data(), llvmBinary_.size(), + AMD_COMGR_DATA_KIND_BC, + "LLVM Binary", &inputs); + + amd_comgr_data_set_t linked_bc; + bool hasLinkedBC = false; + + if (status == AMD_COMGR_STATUS_SUCCESS) { + status = amd::Comgr::create_data_set(&linked_bc); + } + + bool ret = (status == AMD_COMGR_STATUS_SUCCESS); + if (ret) { + hasLinkedBC = true; + ret = linkLLVMBitcode(inputs, linkOptions, options, &linked_bc); + } + + amd::Comgr::destroy_data_set(inputs); + + if (!ret) { + if (hasLinkedBC) { + amd::Comgr::destroy_data_set(linked_bc); + } + buildLog_ += "Error: Linking bitcode failed: linking source & IR libraries.\n"; + return false; + } + + inputs = linked_bc; + } + std::vector codegenOptions; // TODO: Can this be fixed at the source? options->llvmOptions is a flat diff --git a/projects/clr/rocclr/device/devprogram.hpp b/projects/clr/rocclr/device/devprogram.hpp index 13d90e27d2..55eac9984e 100644 --- a/projects/clr/rocclr/device/devprogram.hpp +++ b/projects/clr/rocclr/device/devprogram.hpp @@ -457,7 +457,8 @@ class Program : public amd::HeapObject { bool linkLLVMBitcode(const amd_comgr_data_set_t inputs, const std::vector& options, amd::option::Options* amdOptions, amd_comgr_data_set_t* output, - char* binaryData[] = nullptr, size_t* binarySize = nullptr); + char* binaryData[] = nullptr, size_t* binarySize = nullptr, + const bool link_dev_libs = true); //! Create the bitcode of the compiled input dataset bool compileToLLVMBitcode(const amd_comgr_data_set_t compileInputs,