[Mesa-dev] [PATCH 3/3] r600g: Handle multiple kernels in the same program

Tom Stellard tom at stellard.net
Thu Sep 13 13:41:56 PDT 2012


From: Tom Stellard <thomas.stellard at amd.com>

---
 src/gallium/drivers/r600/evergreen_compute.c |  1 +
 src/gallium/drivers/r600/llvm_wrapper.cpp    | 13 +++++++++++++
 src/gallium/drivers/r600/llvm_wrapper.h      |  1 +
 3 files changed, 15 insertions(+)

diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c
index 3533312..72c27ae 100644
--- a/src/gallium/drivers/r600/evergreen_compute.c
+++ b/src/gallium/drivers/r600/evergreen_compute.c
@@ -143,6 +143,7 @@ void *evergreen_create_compute_state(
 
 #ifdef HAVE_OPENCL 
 	shader->mod = llvm_parse_bitcode(code, header->num_bytes);
+	llvm_strip_unused_kernels(shader->mod, cso->entry_symbol);
 
 	r600_compute_shader_create(ctx_, shader->mod, &shader->bc);
 #endif
diff --git a/src/gallium/drivers/r600/llvm_wrapper.cpp b/src/gallium/drivers/r600/llvm_wrapper.cpp
index 174fb01..df2976a 100644
--- a/src/gallium/drivers/r600/llvm_wrapper.cpp
+++ b/src/gallium/drivers/r600/llvm_wrapper.cpp
@@ -1,9 +1,11 @@
 #include <llvm/ADT/OwningPtr.h>
 #include <llvm/ADT/StringRef.h>
 #include <llvm/LLVMContext.h>
+#include <llvm/PassManager.h>
 #include <llvm/Support/IRReader.h>
 #include <llvm/Support/MemoryBuffer.h>
 #include <llvm/Support/SourceMgr.h>
+#include <llvm/Transforms/IPO.h>
 
 #include "llvm_wrapper.h"
 
@@ -17,3 +19,14 @@ extern "C" LLVMModuleRef llvm_parse_bitcode(const unsigned char * bitcode, unsig
 	M.reset(llvm::ParseIR(buffer, Err, llvm::getGlobalContext()));
 	return wrap(M.take());
 }
+
+extern "C" void llvm_strip_unused_kernels(LLVMModuleRef mod, const char *kernel_name)
+{
+	llvm::Module *M = llvm::unwrap(mod);
+	std::vector<const char *> export_list;
+	export_list.push_back(kernel_name);
+	llvm::PassManager PM;
+	PM.add(llvm::createInternalizePass(export_list));
+	PM.add(llvm::createGlobalDCEPass());
+	PM.run(*M);
+}
diff --git a/src/gallium/drivers/r600/llvm_wrapper.h b/src/gallium/drivers/r600/llvm_wrapper.h
index 3a69645..e65f3a0 100644
--- a/src/gallium/drivers/r600/llvm_wrapper.h
+++ b/src/gallium/drivers/r600/llvm_wrapper.h
@@ -8,6 +8,7 @@ extern "C" {
 #endif
 
 LLVMModuleRef llvm_parse_bitcode(const unsigned char * bitcode, unsigned bitcode_len);
+void llvm_strip_unused_kernels(LLVMModuleRef mod, const char *kernel_name);
 
 #ifdef __cplusplus
 }
-- 
1.7.11.4



More information about the mesa-dev mailing list