gallivm: make sure that the alloca's are the very first thing in the function
authorZack Rusin <zackr@vmware.com>
Mon, 29 Mar 2010 20:17:17 +0000 (16:17 -0400)
committerZack Rusin <zackr@vmware.com>
Mon, 29 Mar 2010 20:18:16 +0000 (16:18 -0400)
otherwise mem2reg can't put them in registers

src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c

index f160be878f87b0ae7f18d8311bcd24cdeca7b819..95cd6a0ecf3eccb58649486ff31aad0afae77d6c 100644 (file)
@@ -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;
 }