summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan Cain <bryancain3@gmail.com>2011-07-21 16:29:56 -0500
committerBryan Cain <bryancain3@gmail.com>2011-08-01 17:59:10 -0500
commit0da994a9f15b461d16cf88ce16dc07e98dfada6f (patch)
tree609d224830710ede753f25dd7ba7e8548b559c12
parent7732822c833ee22e259af3f8bd2bfb57c986612e (diff)
glsl_to_tgsi: make assignment hack safer
Fixes an assertion failure in piglit test glsl-texcoord-array.
-rw-r--r--src/mesa/state_tracker/st_glsl_to_tgsi.cpp7
1 files changed, 4 insertions, 3 deletions
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index 389e5d8e2ef..6e01a44a733 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -1917,12 +1917,13 @@ glsl_to_tgsi_visitor::visit(ir_assignment *ir)
ir->rhs == ((glsl_to_tgsi_instruction *)this->instructions.get_tail())->ir &&
type_size(ir->lhs->type) == 1) {
/* To avoid emitting an extra MOV when assigning an expression to a
- * variable, change the destination register of the last instruction
- * emitted as part of the expression to the assignment variable.
+ * variable, emit the last instruction of the expression again, but
+ * replace the destination register with the target of the assignment.
+ * Dead code elimination will remove the original instruction.
*/
glsl_to_tgsi_instruction *inst;
inst = (glsl_to_tgsi_instruction *)this->instructions.get_tail();
- inst->dst = l;
+ emit(ir, inst->op, l, inst->src[0], inst->src[1], inst->src[2]);
} else {
for (i = 0; i < type_size(ir->lhs->type); i++) {
emit(ir, TGSI_OPCODE_MOV, l, r);