radv: using tls to store llvm related info and speed up compiles (v10)
This uses the common compiler passes abstraction to help radv avoid fixed cost compiler overheads. This uses a linked list per thread stored in thread local storage, with an entry in the list for each target machine. This should remove all the fixed overheads setup costs of creating the pass manager each time. This takes a demo app time to compile the radv meta shaders on nocache and exit from 1.7s to 1s. It also has been reported to take the startup time of uncached shaders on RoTR from 12m24s to 11m35s (Alex) v2: fix llvm6 build, inline emit function, handle multiple targets in one thread v3: rebase and port onto new structure v4: rename some vars (Bas) v5: drag all code into radv for now, we can refactor it out later for radeonsi if we make it shareable v6: use a bit more C++ in the wrapper v7: logic bugs fixed so it actually runs again. v8: rebase on top of radeonsi changes. v9: drop some C++ headers, cleanup list entry v10: use pop_back (didn't have enough caffeine) Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
@@ -27,6 +27,7 @@
|
||||
|
||||
#include "radv_private.h"
|
||||
#include "radv_shader.h"
|
||||
#include "radv_shader_helper.h"
|
||||
#include "nir/nir.h"
|
||||
|
||||
#include <llvm-c/Core.h>
|
||||
@@ -3331,12 +3332,7 @@ static unsigned ac_llvm_compile(LLVMModuleRef M,
|
||||
struct ac_llvm_compiler *ac_llvm)
|
||||
{
|
||||
unsigned retval = 0;
|
||||
char *err;
|
||||
LLVMContextRef llvm_ctx;
|
||||
LLVMMemoryBufferRef out_buffer;
|
||||
unsigned buffer_size;
|
||||
const char *buffer_data;
|
||||
LLVMBool mem_err;
|
||||
|
||||
/* Setup Diagnostic Handler*/
|
||||
llvm_ctx = LLVMGetModuleContext(M);
|
||||
@@ -3345,27 +3341,8 @@ static unsigned ac_llvm_compile(LLVMModuleRef M,
|
||||
&retval);
|
||||
|
||||
/* Compile IR*/
|
||||
mem_err = LLVMTargetMachineEmitToMemoryBuffer(ac_llvm->tm, M, LLVMObjectFile,
|
||||
&err, &out_buffer);
|
||||
|
||||
/* Process Errors/Warnings */
|
||||
if (mem_err) {
|
||||
fprintf(stderr, "%s: %s", __FUNCTION__, err);
|
||||
free(err);
|
||||
if (!radv_compile_to_binary(ac_llvm, M, binary))
|
||||
retval = 1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Extract Shader Code*/
|
||||
buffer_size = LLVMGetBufferSize(out_buffer);
|
||||
buffer_data = LLVMGetBufferStart(out_buffer);
|
||||
|
||||
ac_elf_read(buffer_data, buffer_size, binary);
|
||||
|
||||
/* Clean up */
|
||||
LLVMDisposeMemoryBuffer(out_buffer);
|
||||
|
||||
out:
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user