diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_bld_flow.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_bld_flow.c b/src/gallium/drivers/llvmpipe/lp_bld_flow.c index 161ec95d8c..693742ff85 100644 --- a/src/gallium/drivers/llvmpipe/lp_bld_flow.c +++ b/src/gallium/drivers/llvmpipe/lp_bld_flow.c @@ -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]; } } |