OSDN Git Service

llvmpipe: fix more if/else/endif design bugs
authorBrian Paul <brianp@vmware.com>
Fri, 8 Jan 2010 19:47:30 +0000 (12:47 -0700)
committerBrian Paul <brianp@vmware.com>
Fri, 8 Jan 2010 19:47:30 +0000 (12:47 -0700)
src/gallium/drivers/llvmpipe/lp_bld_flow.c

index 161ec95..693742f 100644 (file)
@@ -647,9 +647,12 @@ lp_build_if(struct lp_build_if_state *ctx,
    LLVMPositionBuilderAtEnd(builder, ifthen->merge_block);
 
    /* create a phi node for each variable */
-   for (i = 0; i < flow->num_variables; i++)
+   for (i = 0; i < flow->num_variables; i++) {
       ifthen->phi[i] = LLVMBuildPhi(builder, LLVMTypeOf(*flow->variables[i]), "");
 
+      /* add add the initial value of the var from the entry block */
+      LLVMAddIncoming(ifthen->phi[i], flow->variables[i], &ifthen->entry_block, 1);
+   }
 
    /* create/insert true_block before merge_block */
    ifthen->true_block = LLVMInsertBasicBlock(ifthen->merge_block, "if-true-block");
@@ -706,21 +709,20 @@ lp_build_endif(struct lp_build_if_state *ctx)
       for (i = 0; i < flow->num_variables; i++) {
          assert(*flow->variables[i]);
          LLVMAddIncoming(ifthen->phi[i], flow->variables[i], &ifthen->false_block, 1);
+
+         /* replace the variable ref with the phi function */
+         *flow->variables[i] = ifthen->phi[i];
       }
    }
    else {
       /* no else clause */
       LLVMPositionBuilderAtEnd(ctx->builder, ifthen->merge_block);
       for (i = 0; i < flow->num_variables; i++) {
-         LLVMValueRef undef;
-
          assert(*flow->variables[i]);
-
          LLVMAddIncoming(ifthen->phi[i], flow->variables[i], &ifthen->true_block, 1);
 
-         /* undef value from the block preceeding the 'if' */
-         undef = LLVMGetUndef(LLVMTypeOf(*flow->variables[i]));
-         LLVMAddIncoming(ifthen->phi[i], &undef, &ifthen->entry_block, 1);
+         /* replace the variable ref with the phi function */
+         *flow->variables[i] = ifthen->phi[i];
       }
    }