[jmm-dev] Jmm revision status

Hans Boehm boehm at acm.org
Fri Jul 18 22:20:46 UTC 2014

I'm not quite sure what you mean by "the usual benign weirdness"?

Preserving load->store ordering (or equivalently requiring rf U hb to be
acyclic) leads to an observably different memory model from what we have
now.  If I have

Thread1: r1 = x; y = r1;

Thread2: r2 = y; x = 42;

r1 = r2 = 42 would no longer be allowed.

(In the section 6.2 version of the spec, we'd have to write something like

Thread 2: r2 = y; x = 0 * y + 42;

to exhibit the difference.)

I don't see how we could both prohibit this in the specification, but then
not actually enforce it at the hardware level?

Note that having the hardware enforce it often has a minimal or zero
impact, even on ARMv8, depending on how the initial load is used.  If we
actually had, on ARMv8:

 Thread2: r2 = y; x = 42; if (r2 > 0) z = 17;

I believe we can just transform the code to

 Thread2: r2 = y; if (r2 > 0) z = 17; x = 42;

to preserve the ordering.  We add no instructions, but may stall earlier
for r2 to become available.

This makes the cost estimates subtle and nontrivial.  A really dumb
implementations that just adds a conditional branch to each load
(carefully, so that no branch prediction slots are consumed) would be an
interesting data point.  Delaying the bogus branch until the next
non-data-dependent store, and omitting it if there already is an adequate
branch in the interval, would be better.  Also delaying stores past
existing conditionals would presumably be best.

I have no idea how many of these bogus branches actually remain after these
transformations.  The down side is that this will have a major impact on
optimization of Java code.  We'd be dramatically changing the ground rules,


On Fri, Jul 18, 2014 at 8:38 AM, Doug Lea <dl at cs.oswego.edu> wrote:

> On 07/17/2014 06:57 PM, Hans Boehm wrote:
>> A few other updates:  Brian and I had a paper in MSPC 14
>> (http://dl.acm.org/citation.cfm?id=2618134) that mostly summarizes the
>> out-of-thin-air issues and solutions based on prohibiting store->load
>> reordering.  I would argue that those are still the most practical
>> solutions we
>> currently have.
> Has anyone thought through a rule that amounts to requiring
> compilers preserve them (as in your section 6), but treating
> those relaxed/non-atomic cases  where Arm/Power don't honor
> them as just the usual benign weirdness? Are there any
> cases where the consequences are any worse than other cases
> that we claim are benign? I think that some of Viktor et al's
> variants come close to this.
> -Doug

More information about the jmm-dev mailing list