mesa: gls: fix broken else clause of conditional break/continue
authorBrian Paul <brian.paul@tungstengraphics.com>
Thu, 24 Jul 2008 21:49:09 +0000 (15:49 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Thu, 24 Jul 2008 21:49:09 +0000 (15:49 -0600)
In the following case:

   for () {
      if (cond)
         break;  // or continue;
      else
         something;
   }

The "something" block didn't get emitted.

src/mesa/shader/slang/slang_codegen.c
src/mesa/shader/slang/slang_emit.c

index 40f4105a64d5963514949292640337024a6e2f61..1b69277387e3108cd51b8b7fe552ac3e2a170eb6 100644 (file)
@@ -2194,22 +2194,16 @@ _slang_gen_if(slang_assemble_ctx * A, const slang_operation *oper)
    cond = _slang_gen_operation(A, &oper->children[0]);
    cond = new_cond(cond);
 
-   if (is_operation_type(&oper->children[1], SLANG_OPER_BREAK)) {
+   if (is_operation_type(&oper->children[1], SLANG_OPER_BREAK)
+       && !haveElseClause) {
       /* Special case: generate a conditional break */
       ifBody = new_break_if_true(A->CurLoop, cond);
-      if (haveElseClause) {
-         elseBody = _slang_gen_operation(A, &oper->children[2]);
-         return new_seq(ifBody, elseBody);
-      }
       return ifBody;
    }
-   else if (is_operation_type(&oper->children[1], SLANG_OPER_CONTINUE)) {
+   else if (is_operation_type(&oper->children[1], SLANG_OPER_CONTINUE)
+            && !haveElseClause) {
       /* Special case: generate a conditional break */
       ifBody = new_cont_if_true(A->CurLoop, cond);
-      if (haveElseClause) {
-         elseBody = _slang_gen_operation(A, &oper->children[2]);
-         return new_seq(ifBody, elseBody);
-      }
       return ifBody;
    }
    else {
index c28894630ceee18d31c94d5a97af48c94bb52b74..1f4d962bdf6b1834ca8c3f9ac3c72309de736008 100644 (file)
@@ -161,9 +161,7 @@ free_temp_storage(slang_var_table *vt, slang_ir_node *n)
       if (_slang_is_temp(vt, n->Store)) {
          _slang_free_temp(vt, n->Store);
          n->Store->Index = -1;
-         n->Store->Size = -1;
-         /*_mesa_free(n->Store);*/ /* XXX leak */
-         n->Store = NULL;
+         n->Store = NULL; /* XXX this may not be needed */
       }
    }
 }