Class InlinedLoopConditionProfile

java.lang.Object
com.oracle.truffle.api.profiles.InlinedProfile
com.oracle.truffle.api.profiles.InlinedLoopConditionProfile

public final class InlinedLoopConditionProfile extends InlinedProfile

InlinedLoopConditionProfiles are designed to profile the outcome of loop conditions. Loop profiles can be used to profile unpredictable loops as well as predictable loops. This profile is intended to be used in combination with Truffle DSL.

Uncounted loop usage example:

 class LoopNode extends Node {

     abstract void execute();

     @Specialization
     void doDefault(@Cached InlinedLoopConditionProfile loopProfile) {
         // loop count cannot be predicted
         while (loopProfile.profile(this, Math.random() >= 0.9)) {
             // work
         }
     }
 }
 

Counted loop usage example:

 class CountedLoopNode extends Node {

     abstract void execute(int length);

     @Specialization
     void doDefault(int length, @Cached InlinedLoopConditionProfile loopProfile) {
         // loop count can be predicted
         loopProfile.profileCounted(this, length);
         for (int i = 0; loopProfile.inject(this, i < length); i++) {
             // work
         }
     }
 }
 

The advantage of using profileCounted(Node, long) to using profile(Node, boolean) is that it incurs less overhead in the interpreter. Using inject(Node, boolean) is a no-op in the interpreter while profile(Node, boolean) needs to use a counter for each iteration.

Since:
23.0
See Also:
  • Method Details

    • profile

      public boolean profile(Node node, boolean condition)
      Since:
      23.0
    • profileCounted

      public void profileCounted(Node node, long length)
      Provides an alternative way to profile counted loops with less interpreter footprint. Please see InlinedLoopConditionProfile for an usage example.
      Since:
      23.0
      See Also:
    • inject

      public boolean inject(Node node, boolean condition)
      Provides an alternative way to profile counted loops with less interpreter footprint. Please see InlinedLoopConditionProfile for an usage example.
      Since:
      23.0
    • wasTrue

      public boolean wasTrue(Node node)
      Returns true if the profile(Node, boolean) method ever received a true value, otherwise false. For profiles with profiling disabled or uncached profiles this method always returns true.
      Since:
      23.0
    • wasFalse

      public boolean wasFalse(Node node)
      Returns true if the profile(Node, boolean) method ever received a false value, otherwise false. For profiles with profiling disabled or uncached profiles this method always returns true.
      Since:
      23.0
    • disable

      public void disable(Node node)
      Disables this profile by setting it to its generic state. After disabling it is guaranteed to never deoptimize on any invocation of a profile method.

      This method must not be called on compiled code paths. Note that disabling the profile will not invalidate existing compiled code that uses this profile.

      Specified by:
      disable in class InlinedProfile
      Since:
      23.0
    • reset

      public void reset(Node node)
      Resets this profile to its uninitialized state. Has no effect if this profile is already in its uninitialized state or a disabled version of this profile is used.

      This method must not be called on compiled code paths. Note that disabling the profile will not invalidate existing compiled code that uses this profile.

      Specified by:
      reset in class InlinedProfile
      Since:
      23.0
    • toString

      public String toString(Node node)
      Prints a string representation of this inlined profile given a target node.
      Specified by:
      toString in class InlinedProfile
      Since:
      23.0
    • inline

      Returns an inlined version of the profile. This version is automatically used by Truffle DSL node inlining.
      Since:
      23.0
    • getUncached

      public static InlinedLoopConditionProfile getUncached()
      Returns the uncached version of the profile. The uncached version of a profile does not perform any profiling.
      Since:
      23.0