From: Steven A. <au...@wa...> - 2004-09-11 03:12:16
|
Steven Augart wrote, on Thursday, 9 September 2004: > Jeroen Frijters wrote, on 5 September 2004: >> * Worker.java >> readyFlag & doneFlag must be volatile > > > Thank you. In MonitorTest.java, the startCounting flag should also be > volatile. I've fixed these. I wonder why our regression tests were > always passing with this problem present. It makes me think that maybe > Jikes RVM's optimizing compiler doesn't take advantage of these > opportunities for caching, but I don't know. > > while (!doneFlag) > ; Dave Grove helped me figure out the answer to this today. Jikes RVM didn't optimize out the repeated load-from-memory operation (by caching doneFlag in a register) because the actual code looked like this: class MonitorTest { public static void main ... Worker w = new Worker(...); ... while ( ! w.doneFlag ) ; } At the time that we compiled the method MonitorTest.main, the class Worker had not been loaded yet. So, Jikes RVM's optimizing compiler had no way of knowing whether Worker.doneFlag was volatile; the only correct thing to do in that case is to make the conservative assumption that Worker.doneFlag might be volatile and compile MonitorTest.main() appropriately. In order to let Jikes RVM take advantage of this opportunity for optimization, we would presumably have to load in the class Worker before compiling methods in MonitorTest. According to sections 12.1.2 and 12.3 of the JLS <http://java.sun.com/docs/books/jls/second_edition/html/execution.doc.html#46604> it would be legal to do this sort of aggressive loading and resolution of classes, but the lazy loading and resolution that Jikes RVM does is also OK. I wonder whether anybody has been using Jikes RVM in applications where it would have been beneficial to have this sort of early linking and resolution, and whether implementing it as an option would improve our performance on some benchmarks, by letting us exploit currently-missed optimization opportunities. --Steve Augart -- Steven Augart Jikes RVM, a free, open source, Virtual Machine: http://oss.software.ibm.com/jikesrvm |