summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2010-01-08 12:47:30 -0700
committerBrian Paul <[email protected]>2010-01-08 12:47:30 -0700
commit5208af7853989c30bea6ce8c4ac659a2f2304225 (patch)
treee537948aff8848d69f5c470e117b1402ab6cd464
parent855d7f51e4cfd6f4ce04bf34164676ba3bc2fc39 (diff)
llvmpipe: fix more if/else/endif design bugs
-rw-r--r--src/gallium/drivers/llvmpipe/lp_bld_flow.c16
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];
}
}