diff options
author | Brian Paul <[email protected]> | 2010-01-08 12:47:30 -0700 |
---|---|---|
committer | Brian Paul <[email protected]> | 2010-01-08 12:47:30 -0700 |
commit | 5208af7853989c30bea6ce8c4ac659a2f2304225 (patch) | |
tree | e537948aff8848d69f5c470e117b1402ab6cd464 | |
parent | 855d7f51e4cfd6f4ce04bf34164676ba3bc2fc39 (diff) |
llvmpipe: fix more if/else/endif design bugs
-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 161ec95d8c3..693742ff859 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]; } } |