Review: compiler failed to mark a const as "not written" (issue195084)


Reviewers: ,

Bug fix:

When a function's 'return' statement is not the last statement in the
function body, we use a trick where we wrap the function in a 'do { ...
} while (0)' and the return is like a 'break'. (This is because we
don't have a true jump instruction, which is a pain for SIMD.) We say
'while 0' because we don't want to LOOP, we just want a loop to jump out
of, if you catch my drift.

The bug is that I made the "0" a true constant, but forgot to mark that
the while condition was not written by the while statement itself, and
therefore got a "can't write to a constant" error later on.

Please review this at

Affected files:

Index: src/liboslcomp/codegen.cpp
--- src/liboslcomp/codegen.cpp (revision 552)
+++ src/liboslcomp/codegen.cpp (working copy)
@@ -1181,7 +1181,8 @@
Symbol *condvar = m_compiler->make_constant (0);
size_t argstart = m_compiler->add_op_args (1, &condvar);
m_compiler->ircode(loop_op).set_args (argstart, 1);
- m_compiler->ircode(loop_op).argread (0, true); // read also
+ m_compiler->ircode(loop_op).argread (0, true); // read
+ m_compiler->ircode(loop_op).argwrite (0, false); // not written
int endlabel = m_compiler->next_op_label ();
m_compiler->ircode(loop_op).set_jump (startlabel, startlabel,
endlabel, endlabel);


On this one, I'll have to take your word for it. LGTM!

Larry Gritz <l...@...>

Right before checking in, I noticed that the same mistake could happen for ordinary loops:

while (1) { }
do { } while(0);

I just fixed in in both places in the identical way.

On Jan 28, 2010, at 8:50 AM, <cliffo...@...> <cliffo...@...> wrote:

On this one, I'll have to take your word for it. LGTM!
Larry Gritz