From b64f17e1c70eb2fb940f41d20eb96f9d2d6b06da Mon Sep 17 00:00:00 2001
From: foreman
Date: Wed, 29 Jul 2015 02:00:14 -0400
Subject: [PATCH] P4 to Git Change 1175027 by yaxunl@yaxunl_stg_win50 on
2015/07/29 01:46:32
ECR #354633 - SPIR-V: Refactored SPIR-V instruction classes. Added check for word count.
Refactored lower blocks pass.
Fixed bug in pipes builtin translation.
Added translation of C++11 atomic builtin functions.
Added drop-in biway translation of LLVM/SPIR-V for debugging/testing purpose.
Affected files ...
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/build/Makefile.api#117 edit
... //depot/stg/opencl/drivers/opencl/compiler/lib/backends/common/linker.cpp#129 edit
... //depot/stg/opencl/drivers/opencl/compiler/lib/build/Makefile.complib#87 edit
... //depot/stg/opencl/drivers/opencl/compiler/llvm/lib/SPIRV/SPRVInternal.h#7 edit
... //depot/stg/opencl/drivers/opencl/compiler/llvm/lib/SPIRV/SPRVLowerOCLBlocks.cpp#1 add
... //depot/stg/opencl/drivers/opencl/compiler/llvm/lib/SPIRV/SPRVReader.cpp#8 edit
... //depot/stg/opencl/drivers/opencl/compiler/llvm/lib/SPIRV/SPRVRegularizeOCL20.cpp#6 edit
... //depot/stg/opencl/drivers/opencl/compiler/llvm/lib/SPIRV/SPRVUtil.cpp#8 edit
... //depot/stg/opencl/drivers/opencl/compiler/llvm/lib/SPIRV/SPRVWriter.cpp#9 edit
... //depot/stg/opencl/drivers/opencl/compiler/llvm/lib/SPIRV/libSPIRV/SPRVInstruction.cpp#2 edit
... //depot/stg/opencl/drivers/opencl/compiler/llvm/lib/SPIRV/libSPIRV/SPRVInstruction.h#6 edit
... //depot/stg/opencl/drivers/opencl/compiler/llvm/lib/SPIRV/libSPIRV/SPRVModule.cpp#5 edit
... //depot/stg/opencl/drivers/opencl/compiler/llvm/lib/SPIRV/libSPIRV/SPRVModule.h#4 edit
... //depot/stg/opencl/drivers/opencl/compiler/llvm/lib/SPIRV/libSPIRV/SPRVOpCode.h#3 edit
... //depot/stg/opencl/drivers/opencl/compiler/llvm/lib/SPIRV/libSPIRV/SPRVOpCodeEnum.h#2 edit
... //depot/stg/opencl/drivers/opencl/compiler/llvm/lib/SPIRV/libSPIRV/SPRVValue.h#4 edit
---
.../compiler/lib/backends/common/linker.cpp | 64 +++++++++++++++++++
1 file changed, 64 insertions(+)
diff --git a/rocclr/compiler/lib/backends/common/linker.cpp b/rocclr/compiler/lib/backends/common/linker.cpp
index 7324e5877a..e196981540 100644
--- a/rocclr/compiler/lib/backends/common/linker.cpp
+++ b/rocclr/compiler/lib/backends/common/linker.cpp
@@ -14,6 +14,9 @@
#include "utils/target_mappings.h"
#include "acl.h"
+#if !(defined(LEGACY_COMPLIB) || defined(MAIN_LINE))
+#define HAS_SPIRV
+#endif
#if defined(LEGACY_COMPLIB)
#include "llvm/Instructions.h"
@@ -84,6 +87,10 @@
#include "llvm/AMDILFuncSupport.h"
#endif
+#ifdef HAS_SPIRV
+#include "llvm/Support/SPIRV.h"
+#endif
+
// need to undef DEBUG before using DEBUG macro in llvm/Support/Debug.h
#ifdef DEBUG
#undef DEBUG
@@ -124,6 +131,14 @@ namespace {
using namespace llvm;
+#ifdef HAS_SPIRV
+// Enable drop-in bi-way translation of LLVM/SPIR-V for testing purpose.
+cl::opt TestSpirv("test-spirv",
+ cl::desc("Test SPIR-V translation"),
+ cl::init(false),
+ cl::Hidden);
+#endif
+
// LoadFile - Read the specified bitcode file in and return it. This routine
// searches the link path for the specified file to try to find it...
//
@@ -487,6 +502,42 @@ checkAndFixAclBinaryTarget(llvm::Module* module, aclBinary* elf,
#endif
}
+#ifdef HAS_SPIRV
+bool
+translateSpirv(llvm::Module *&M, const std::string &DumpSpirv,
+ const std::string &DumpLlvm){
+ std::stringstream SS;
+ std::string Err;
+ if (!llvm::WriteSPRV(M, SS, Err)) {
+ llvm::errs() << "Fails to save LLVM as SPRV: " << Err << '\n';
+ return false;
+ }
+
+ if (!DumpSpirv.empty()) {
+ std::ofstream OFS(DumpSpirv, std::ios::binary);
+ OFS << SS.str();
+ OFS.close();
+ }
+
+ if (!llvm::ReadSPRV(M->getContext(), SS, M, Err)) {
+ llvm::errs() << "Fails to load SPIRV as LLVM Module: " << Err << '\n';
+ return false;
+ }
+
+ if (!DumpLlvm.empty()) {
+ std::error_code EC;
+ llvm::raw_fd_ostream outs(DumpLlvm.c_str(), EC, llvm::sys::fs::F_None);
+ if (!EC)
+ WriteBitcodeToFile(M, outs);
+ else {
+ llvm::errs() << EC.message();
+ return false;
+ }
+ }
+ return true;
+}
+#endif
+
int
amdcl::OCLLinker::link(llvm::Module* input, std::vector &libs)
{
@@ -550,6 +601,19 @@ amdcl::OCLLinker::link(llvm::Module* input, std::vector &libs)
printf(EC.message().c_str());
#endif
}
+
+#ifdef HAS_SPIRV
+ if (amd::TestSpirv) {
+ std::string DumpSpirv;
+ std::string DumpLlvm;
+ if (Options()->isDumpFlagSet(amd::option::DUMP_BC_ORIGINAL)) {
+ DumpSpirv = Options()->getDumpFileName(".spv");
+ DumpLlvm = Options()->getDumpFileName("_spirv.bc");
+ }
+ translateSpirv(llvmbinary_, DumpSpirv, DumpLlvm);
+ }
+#endif
+
std::vector LibMs;
// The AMDIL GPU libraries include 32 bit specific, 64 bit specific and common