From 9e6d58fac26a12246e9e560f3802ebcbce2423bc Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Mon, 15 Oct 2007 08:12:22 -0400 Subject: Generate the base shader. --- src/mesa/pipe/llvm/llvmtgsi.cpp | 117 +++++++++++++++++++++++++++++++++------- 1 file changed, 97 insertions(+), 20 deletions(-) (limited to 'src/mesa/pipe/llvm/llvmtgsi.cpp') diff --git a/src/mesa/pipe/llvm/llvmtgsi.cpp b/src/mesa/pipe/llvm/llvmtgsi.cpp index 46b7561b5e..1abc148521 100644 --- a/src/mesa/pipe/llvm/llvmtgsi.cpp +++ b/src/mesa/pipe/llvm/llvmtgsi.cpp @@ -14,15 +14,88 @@ #include #include #include +#include +#include #include #include #include #include #include #include +#include +#include +#include +#include #include #include +using namespace llvm; +#include "llvm_base_shader.cpp" + + +static inline void addPass(PassManager &PM, Pass *P) { + // Add the pass to the pass manager... + PM.add(P); +} + +static inline void AddStandardCompilePasses(PassManager &PM) { + PM.add(createVerifierPass()); // Verify that input is correct + + addPass(PM, createLowerSetJmpPass()); // Lower llvm.setjmp/.longjmp + + // If the -strip-debug command line option was specified, do it. + //if (StripDebug) + // addPass(PM, createStripSymbolsPass(true)); + + addPass(PM, createRaiseAllocationsPass()); // call %malloc -> malloc inst + addPass(PM, createCFGSimplificationPass()); // Clean up disgusting code + addPass(PM, createPromoteMemoryToRegisterPass());// Kill useless allocas + addPass(PM, createGlobalOptimizerPass()); // Optimize out global vars + addPass(PM, createGlobalDCEPass()); // Remove unused fns and globs + addPass(PM, createIPConstantPropagationPass());// IP Constant Propagation + addPass(PM, createDeadArgEliminationPass()); // Dead argument elimination + addPass(PM, createInstructionCombiningPass()); // Clean up after IPCP & DAE + addPass(PM, createCFGSimplificationPass()); // Clean up after IPCP & DAE + + addPass(PM, createPruneEHPass()); // Remove dead EH info + + //if (!DisableInline) + addPass(PM, createFunctionInliningPass()); // Inline small functions + addPass(PM, createArgumentPromotionPass()); // Scalarize uninlined fn args + + addPass(PM, createTailDuplicationPass()); // Simplify cfg by copying code + addPass(PM, createInstructionCombiningPass()); // Cleanup for scalarrepl. + addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs + addPass(PM, createScalarReplAggregatesPass()); // Break up aggregate allocas + addPass(PM, createInstructionCombiningPass()); // Combine silly seq's + addPass(PM, createCondPropagationPass()); // Propagate conditionals + + addPass(PM, createTailCallEliminationPass()); // Eliminate tail calls + addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs + addPass(PM, createReassociatePass()); // Reassociate expressions + addPass(PM, createLoopRotatePass()); + addPass(PM, createLICMPass()); // Hoist loop invariants + addPass(PM, createLoopUnswitchPass()); // Unswitch loops. + addPass(PM, createLoopIndexSplitPass()); // Index split loops. + addPass(PM, createInstructionCombiningPass()); // Clean up after LICM/reassoc + addPass(PM, createIndVarSimplifyPass()); // Canonicalize indvars + addPass(PM, createLoopUnrollPass()); // Unroll small loops + addPass(PM, createInstructionCombiningPass()); // Clean up after the unroller + addPass(PM, createGVNPass()); // Remove redundancies + addPass(PM, createSCCPPass()); // Constant prop with SCCP + + // Run instcombine after redundancy elimination to exploit opportunities + // opened up by them. + addPass(PM, createInstructionCombiningPass()); + addPass(PM, createCondPropagationPass()); // Propagate conditionals + + addPass(PM, createDeadStoreEliminationPass()); // Delete dead stores + addPass(PM, createAggressiveDCEPass()); // SSA based 'Aggressive DCE' + addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs + addPass(PM, createSimplifyLibCallsPass()); // Library Call Optimizations + addPass(PM, createDeadTypeEliminationPass()); // Eliminate dead types + addPass(PM, createConstantMergePass()); // Merge dup global constants +} static void translate_declaration(llvm::Module *module, @@ -341,7 +414,7 @@ translate_instruction(llvm::Module *module, static llvm::Module * tgsi_to_llvm(const struct tgsi_token *tokens) { - llvm::Module *mod = new llvm::Module("tgsi"); + llvm::Module *mod = createBaseShader(); struct tgsi_parse_context parse; struct tgsi_full_instruction fi; struct tgsi_full_declaration fd; @@ -402,18 +475,33 @@ ga_llvm_from_tgsi(const struct tgsi_token *tokens) struct ga_llvm_prog *ga_llvm = (struct ga_llvm_prog *)malloc(sizeof(struct ga_llvm_prog)); llvm::Module *mod = tgsi_to_llvm(tokens); + + /* Run optimization passes over it */ + PassManager passes; + // Add an appropriate TargetData instance for this module... + passes.add(new TargetData(mod)); + AddStandardCompilePasses(passes); + std::cout<<"Running optimization passes..."<getFunction("run_vertex_shader"); + std::cout << "run_vertex_shader = "<function = ee->getPointerToFunctionOrStub(func); + std::cout << " -- FUNC is " <function; + return ga_llvm; } @@ -423,6 +511,7 @@ void ga_llvm_prog_delete(struct ga_llvm_prog *prog) delete mod; prog->module = 0; prog->engine = 0; + prog->function = 0; free(prog); } @@ -430,24 +519,12 @@ int ga_llvm_prog_exec(struct ga_llvm_prog *prog, float (*inputs)[32][4], void *dests[16*32*4], float (*consts)[4], - int count) + int count, + int num_attribs) { - //std::cout << "START "<(prog->module); - llvm::Function *func = mod->getFunction("main"); - llvm::ExecutionEngine *ee = static_cast(prog->engine); - - std::vector args(0); - //args[0] = GenericValue(&st); - //std::cout << "Mod is "<<*mod; - //std::cout << "\n\nRunning llvm: " << std::endl; - if (func) { - std::cout << "Func is "<runFunction(func, args); - } + std::cout << "---- START LLVM Execution "<