diff options
author | Zack Rusin <[email protected]> | 2010-03-29 16:17:17 -0400 |
---|---|---|
committer | Zack Rusin <[email protected]> | 2010-03-29 16:18:16 -0400 |
commit | 012fabca722494162c244a367913562b8cfa4677 (patch) | |
tree | bf3ac426fb17847fa51c387e8a14491e4ddbc477 | |
parent | 625e024b186829f199458679921916971a5b00cb (diff) |
gallivm: make sure that the alloca's are the very first thing in the function
otherwise mem2reg can't put them in registers
-rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c index f160be878f8..95cd6a0ecf3 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c @@ -651,6 +651,19 @@ emit_declaration( unsigned first = decl->Range.First; unsigned last = decl->Range.Last; unsigned idx, i; + LLVMBasicBlockRef current_block = + LLVMGetInsertBlock(bld->base.builder); + LLVMBasicBlockRef first_block = + LLVMGetEntryBasicBlock( + LLVMGetBasicBlockParent(current_block)); + LLVMValueRef first_inst = + LLVMGetFirstInstruction(first_block); + + /* we want alloca's to be the first instruction + * in the function so we need to rewind the builder + * to the very beginning */ + LLVMPositionBuilderBefore(bld->base.builder, + first_inst); for (idx = first; idx <= last; ++idx) { boolean ok; @@ -673,10 +686,15 @@ emit_declaration( ok = TRUE; } - if (!ok) + if (!ok) { + LLVMPositionBuilderAtEnd(bld->base.builder, + current_block); return FALSE; + } } + LLVMPositionBuilderAtEnd(bld->base.builder, + current_block); return TRUE; } |