public final class BranchProfile extends Profile
BranchProfiles are profiles to speculate on branches that are unlikely to be visited. If the
BranchProfile.enter() method is invoked first the optimized code is invalidated and the branch where
BranchProfile.enter() is invoked is enabled for compilation. Otherwise if the BranchProfile.enter() method
was never invoked the branch will not get compiled.
Usage example:
class BranchingNode extendsNode{ finalBranchProfileerrorProfile =BranchProfile.create(); int execute(int value) { if (value ==Integer.MAX_VALUE) { errorProfile.enter(); throw newError("Invalid input value"); } return value; } }
A profile is a Truffle utility class that uses the Truffle compiler
directives to guard for and/or forward runtime information to the compiler. Whenever Truffle DSL
can be used inlined profiles subclasses should be used instead of regular
profile subclasses.
Usage: Profiles should be stored in final or compilation final fields of node classes to ensure that they can get optimized properly.
Profiles must not be shared between ASTs. Using the same profile multiple times in a single
node or in multiple nodes which link to the
same root is allowed. Never store profiles inside runtime values that
leave the scope of the originating AST. This limitation exists because the used mechanism to
invalidate compiled code performs local invalidations only. For global speculations use
assumptions instead.
Compilation: Some profiles like branch profiles do not induce
additional overhead in compiled code. Others like value profiles might
require a runtime check to verify their assumptions which are forwarded to the compiler. Even if
profiles do not induce direct overhead in compiled code it still might get invalidated as a
result of using profiles. Invalidating profiles will result in the invalidation of compiled code.
It is therefore essential to place these profiles in way that is neither too aggressive nor too
conservative.
Footprint: Whether profiling information can be forwarded to the compiler depends on the
capabilities of the runtime system. If the runtime returns
true in TruffleRuntime.isProfilingEnabled() then runtime information will
get collected. This comes at at the cost of additional overhead and footprint in interpreted
mode. Thats why the factory methods of profiles can return implementations where profiling is
disabled. Using disabled profiles makes sense for runtimes that are unable to use the collected
profiling information. Even runtime implementations that are able to use this information might
decide to turn off profiling for benchmarking purposes.
Profile subclasses:
BranchProfile to profile on unlikely branches like errors.ConditionProfile to profile on conditionals or boolean values.LoopConditionProfile to profile on conditionals of loops with special support for
counted loops.ValueProfile to profile on properties like type and identity of values.ByteValueProfile to profile on byte values.IntValueProfile to profile on int values.LongValueProfile to profile on long values.FloatValueProfile to profile on float values.DoubleValueProfile to profile on double values.PrimitiveValueProfile to profile on objects by identity and on primitives by value.
BranchProfile.enter()| Modifier and Type | Method and Description |
|---|---|
static BranchProfile |
create()
Call to create a new instance of a branch profile.
|
void |
disable()
Disables this profile by setting it to its generic state.
|
void |
enter()
Call when an unlikely branch is entered.
|
static BranchProfile |
getUncached()
Returns the uncached version of the profile.
|
static InlinedBranchProfile |
inline(InlineSupport.InlineTarget target)
Returns an inlined version of the profile.
|
void |
reset()
Resets this profile to its uninitialized state.
|
String |
toString() |
clonepublic void enter()
public void disable()
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.
public void reset()
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.
public static BranchProfile create()
public static InlinedBranchProfile inline(InlineSupport.InlineTarget target)
public static BranchProfile getUncached()