Doug --
> Does anyone see any problem in this reasoning? If not, the memory
> model should support it.
I guess I kind of do see a problem. This "feel" a little too
operational, talking in terms of what compilers can and can't do. To
be a little clearer, you say:
Because of the dependency on the volatile read of "data",
the compiler is not allowed to act as if it knows anything about
that element beforehand [*] and so cannot reuse old values.
I agree with everything before the [*] I added, but I don't see that
the conclusion after it necessarily follows. Imagine that I'm compiling
void foo (VolatileArray va) {
int i = va.get(0);
int j = va.get(0);
...
}
and I'm a really agressive compiler. I inline both "get"s. I
recognize that the indices are the same, and I'd like to avoid a load,
so I do:
/* First get */
readBarrier
reg(d1) := data
<bounds check, unless you're clever somehow>
reg(i) := ld [reg(d1) + 0 + arrayHeader]
/* Second get */
readBarrier
reg(d2) := data
if (d1 == d2) {
reg(j) := reg(i);
} else {
<bounds check, unless you're clever somehow>
reg(j) := ld [reg(d2) + 0 + arrayHeader]
}
That is, if the array reference value is the same, then I try to
re-use the previously read element value. After all, the elements
themselves are not volatile, and there has been no intervening
synchronization point. (There isn't even a killing reads issue :-)
FWIW...
Dave
-------------------------------
JavaMemoryModel mailing list - http://www.cs.umd.edu/~pugh/java/memoryModel
This archive was generated by hypermail 2b29 : Thu Oct 13 2005 - 07:00:23 EDT