llvmpipe: Cleanup test programs.

This commit is contained in:
José Fonseca 2009-08-01 18:35:04 +01:00
parent 7d043162c5
commit 7ace0b1f4a
3 changed files with 86 additions and 66 deletions

View File

@ -54,8 +54,8 @@ env.ParseConfig('llvm-config --libs jit interpreter nativecodegen bitwriter')
env.Prepend(LIBS = [llvmpipe] + auxiliaries)
env.Program(
target = 'lp_bld_test',
source = ['lp_bld_test.c'],
target = 'lp_test_format',
source = ['lp_test_format.c'],
)
env.Program(

View File

@ -369,9 +369,9 @@ test_one(const struct pipe_blend_state *blend)
if(LLVMVerifyModule(module, LLVMPrintMessageAction, &error)) {
LLVMDumpModule(module);
LLVMDisposeMessage(error);
abort();
}
LLVMDisposeMessage(error);
provider = LLVMCreateModuleProviderForExistingModule(module);
if (LLVMCreateJITCompiler(&engine, provider, 1, &error)) {
@ -432,8 +432,11 @@ test_one(const struct pipe_blend_state *blend)
}
}
LLVMFreeMachineCodeForFunction(engine, func);
LLVMDisposeExecutionEngine(engine);
//LLVMDisposeModule(module);
if(pass)
LLVMDisposePassManager(pass);
return success;
}

View File

@ -88,27 +88,34 @@ struct pixel_test_case test_cases[] =
};
typedef void (*load_ptr_t)(const void *, float *);
static LLVMValueRef
add_load_rgba_test(LLVMModuleRef module,
enum pipe_format format)
{
LLVMTypeRef args[] = {
LLVMPointerType(LLVMInt8Type(), 0),
LLVMPointerType(LLVMVectorType(LLVMFloatType(), 4), 0)
};
LLVMValueRef func = LLVMAddFunction(module, "load", LLVMFunctionType(LLVMVoidType(), args, 2, 0));
LLVMSetFunctionCallConv(func, LLVMCCallConv);
LLVMValueRef ptr = LLVMGetParam(func, 0);
LLVMValueRef rgba_ptr = LLVMGetParam(func, 1);
LLVMBasicBlockRef block = LLVMAppendBasicBlock(func, "entry");
LLVMBuilderRef builder = LLVMCreateBuilder();
LLVMPositionBuilderAtEnd(builder, block);
LLVMTypeRef args[2];
LLVMValueRef func;
LLVMValueRef ptr;
LLVMValueRef rgba_ptr;
LLVMBasicBlockRef block;
LLVMBuilderRef builder;
LLVMValueRef rgba;
struct lp_build_loop_state loop;
args[0] = LLVMPointerType(LLVMInt8Type(), 0);
args[1] = LLVMPointerType(LLVMVectorType(LLVMFloatType(), 4), 0);
func = LLVMAddFunction(module, "load", LLVMFunctionType(LLVMVoidType(), args, 2, 0));
LLVMSetFunctionCallConv(func, LLVMCCallConv);
ptr = LLVMGetParam(func, 0);
rgba_ptr = LLVMGetParam(func, 1);
block = LLVMAppendBasicBlock(func, "entry");
builder = LLVMCreateBuilder();
LLVMPositionBuilderAtEnd(builder, block);
lp_build_loop_begin(builder, LLVMConstInt(LLVMInt32Type(), 1, 0), &loop);
rgba = lp_build_load_rgba(builder, format, ptr);
@ -123,25 +130,33 @@ add_load_rgba_test(LLVMModuleRef module,
}
typedef void (*store_ptr_t)(void *, const float *);
static LLVMValueRef
add_store_rgba_test(LLVMModuleRef module,
enum pipe_format format)
{
LLVMTypeRef args[] = {
LLVMPointerType(LLVMInt8Type(), 0),
LLVMPointerType(LLVMVectorType(LLVMFloatType(), 4), 0)
};
LLVMValueRef func = LLVMAddFunction(module, "store", LLVMFunctionType(LLVMVoidType(), args, 2, 0));
LLVMSetFunctionCallConv(func, LLVMCCallConv);
LLVMValueRef ptr = LLVMGetParam(func, 0);
LLVMValueRef rgba_ptr = LLVMGetParam(func, 1);
LLVMBasicBlockRef block = LLVMAppendBasicBlock(func, "entry");
LLVMBuilderRef builder = LLVMCreateBuilder();
LLVMPositionBuilderAtEnd(builder, block);
LLVMTypeRef args[2];
LLVMValueRef func;
LLVMValueRef ptr;
LLVMValueRef rgba_ptr;
LLVMBasicBlockRef block;
LLVMBuilderRef builder;
LLVMValueRef rgba;
args[0] = LLVMPointerType(LLVMInt8Type(), 0);
args[1] = LLVMPointerType(LLVMVectorType(LLVMFloatType(), 4), 0);
func = LLVMAddFunction(module, "store", LLVMFunctionType(LLVMVoidType(), args, 2, 0));
LLVMSetFunctionCallConv(func, LLVMCCallConv);
ptr = LLVMGetParam(func, 0);
rgba_ptr = LLVMGetParam(func, 1);
block = LLVMAppendBasicBlock(func, "entry");
builder = LLVMCreateBuilder();
LLVMPositionBuilderAtEnd(builder, block);
rgba = LLVMBuildLoad(builder, rgba_ptr, "");
lp_build_store_rgba(builder, format, ptr, rgba);
@ -156,68 +171,67 @@ add_store_rgba_test(LLVMModuleRef module,
static boolean
test_format(const struct pixel_test_case *test)
{
LLVMModuleRef module = NULL;
LLVMValueRef load = NULL;
LLVMValueRef store = NULL;
LLVMExecutionEngineRef engine = NULL;
LLVMModuleProviderRef provider = NULL;
LLVMPassManagerRef pass = NULL;
char *error = NULL;
const struct util_format_description *desc;
load_ptr_t load_ptr;
store_ptr_t store_ptr;
float unpacked[4];
unsigned packed;
boolean success;
unsigned i;
desc = util_format_description(test->format);
fprintf(stderr, "%s\n", desc->name);
LLVMModuleRef module = LLVMModuleCreateWithName("test");
module = LLVMModuleCreateWithName("test");
LLVMValueRef load = add_load_rgba_test(module, test->format);
LLVMValueRef store = add_store_rgba_test(module, test->format);
load = add_load_rgba_test(module, test->format);
store = add_store_rgba_test(module, test->format);
LLVMVerifyModule(module, LLVMAbortProcessAction, &error);
if(LLVMVerifyModule(module, LLVMPrintMessageAction, &error)) {
LLVMDumpModule(module);
abort();
}
LLVMDisposeMessage(error);
LLVMExecutionEngineRef engine;
LLVMModuleProviderRef provider = LLVMCreateModuleProviderForExistingModule(module);
error = NULL;
LLVMCreateJITCompiler(&engine, provider, 1, &error);
if (error) {
provider = LLVMCreateModuleProviderForExistingModule(module);
if (LLVMCreateJITCompiler(&engine, provider, 1, &error)) {
fprintf(stderr, "%s\n", error);
LLVMDisposeMessage(error);
abort();
}
LLVMPassManagerRef pass = LLVMCreatePassManager();
#if 0
pass = LLVMCreatePassManager();
LLVMAddTargetData(LLVMGetExecutionEngineTargetData(engine), pass);
/* These are the passes currently listed in llvm-c/Transforms/Scalar.h,
* but there are more on SVN. */
LLVMAddConstantPropagationPass(pass);
LLVMAddInstructionCombiningPass(pass);
LLVMAddPromoteMemoryToRegisterPass(pass);
LLVMAddDemoteMemoryToRegisterPass(pass);
LLVMAddGVNPass(pass);
LLVMAddCFGSimplificationPass(pass);
LLVMRunPassManager(pass, module);
LLVMDumpModule(module);
#else
(void)pass;
#endif
load_ptr = (load_ptr_t) LLVMGetPointerToGlobal(engine, load);
store_ptr = (store_ptr_t)LLVMGetPointerToGlobal(engine, store);
float unpacked[4] = {0, 0, 0, 0};
unsigned packed = 0;
memset(unpacked, 0, sizeof unpacked);
packed = 0;
{
typedef void (*load_ptr_t)(const void *, float *);
load_ptr_t load_ptr = (load_ptr_t)LLVMGetPointerToGlobal(engine, load);
load_ptr(&test->packed, unpacked);
store_ptr(&packed, unpacked);
load_ptr(&test->packed, unpacked);
}
{
typedef void (*store_ptr_t)(void *, const float *);
store_ptr_t store_ptr = (store_ptr_t)LLVMGetPointerToGlobal(engine, store);
store_ptr(&packed, unpacked);
}
boolean success = TRUE;
unsigned i;
success = TRUE;
if(test->packed != packed)
success = FALSE;
for(i = 0; i < 4; ++i)
@ -233,9 +247,12 @@ test_format(const struct pixel_test_case *test)
LLVMDumpModule(module);
}
LLVMDisposePassManager(pass);
LLVMFreeMachineCodeForFunction(engine, store);
LLVMFreeMachineCodeForFunction(engine, load);
LLVMDisposeExecutionEngine(engine);
//LLVMDisposeModule(module);
if(pass)
LLVMDisposePassManager(pass);
return success;
}