< prev index next >

src/jdk.vm.ci/share/classes/jdk.vm.ci.meta/src/jdk/vm/ci/meta/SpeculationLog.java

Print this page

        

*** 20,68 **** * or visit www.oracle.com if you need additional information or have any * questions. */ package jdk.vm.ci.meta; - import java.util.*; - import java.util.concurrent.*; - /** ! * Manages a list of unique deoptimization reasons. * */ ! public abstract class SpeculationLog { ! private volatile Object lastFailed; ! private volatile Collection<Object> speculations; ! private Set<Object> failedSpeculations; ! public synchronized void collectFailedSpeculations() { ! if (lastFailed != null) { ! if (failedSpeculations == null) { ! failedSpeculations = new HashSet<>(2); ! } ! failedSpeculations.add(lastFailed); ! lastFailed = null; ! speculations = null; ! } } ! public boolean maySpeculate(Object reason) { ! if (failedSpeculations != null && failedSpeculations.contains(reason)) { ! return false; ! } ! return true; ! } ! protected void addSpeculation(Object reason) { ! assert maySpeculate(reason); ! if (speculations == null) { ! synchronized (this) { ! if (speculations == null) { ! speculations = new ConcurrentLinkedQueue<>(); ! } ! } ! } ! speculations.add(reason); ! } ! public abstract JavaConstant speculate(Object reason); } --- 20,59 ---- * or visit www.oracle.com if you need additional information or have any * questions. */ package jdk.vm.ci.meta; /** ! * Manages unique deoptimization reasons. Reasons are embedded in compiled code and can be ! * invalidated at run time. Subsequent compilations then should not speculate again on such ! * invalidated reasons to avoid repeated deoptimization. * + * All methods of this interface are called by the compiler. There is no need for API to register + * failed speculations during deoptimization, since every VM has different needs there. */ ! public interface SpeculationLog { ! /** ! * Marker interface for speculation objects that can be added to the speculation log. ! */ ! public interface SpeculationReason { } ! /** ! * Must be called before compilation, i.e., before a compiler calls {@link #maySpeculate}. ! */ ! void collectFailedSpeculations(); ! /** ! * If this method returns true, the compiler is allowed to {@link #speculate} with the given ! * reason. ! */ ! boolean maySpeculate(SpeculationReason reason); ! /** ! * Registers a speculation that was performed by the compiler. ! * ! * @return A compiler constant encapsulating the provided reason. It is usually passed as an ! * argument to the deoptimization function. ! */ ! JavaConstant speculate(SpeculationReason reason); }
< prev index next >